Skip to main content
 Web开发网 » 站长学院 » 浏览器插件

如何轻松了解 Python 必学的 django 框架?

2021年10月31日6430百度已收录

django 框架配有一个功能强大的管理站点,里面已经预定义了许多管理站点需要进行的操作,但是有时可能默认的操作不能满足需求,如需要批量更新选中的对象,这需要编写自定义 action 实现。本文基于 django 官方英文文档梳理了一下自定义管理操作需要做的工作,方便快速了解自定义管理操作的实现过程。如何轻松了解 Python 必学的 django 框架?  Django 第1张

作者 | 单雨,责编 | 黄浩然

出品 | CSDN(ID:CSDNnews)

如何轻松了解 Python 必学的 django 框架?  Django 第2张

Admin actions 简介admin actions 是一些在 admin 站点下拉列表中可以选择执行的简单函数,比如删除一个对象操作。

如何轻松了解 Python 必学的 django 框架?  Django 第3张

如何轻松了解 Python 必学的 django 框架?  Django 第4张

编写 Admin actions下面举例说明如何编写Admin action。例如批量更新一个名为 Article 的模型:

from django.db import models

STATUS_CHOICES = [

('d', 'Draft'),

('p', 'Published'),

('w', 'Withdrawn'),

classArticle(models.Model):

title = models.CharField(max_length=100)

body = models.TextField

status = models.CharField(max_length=1,choices=STATUS_CHOICES)

def__str__(self):

returnself.title

下面来编写 action 函数,这个函数接受三个函数:

• 当前的 ModelAdmin

• 一个代表当前 对象

• 一个包含用户选定的对象的 QuerySet (数据库检索对象)。

def make_published(modeladmin, request,queryset):

queryset.update(status='p')

为了达到最佳性能,推荐使用 QuerySet 的 update 方法,

for obj in queryset:

do_something_with(obj)

默认情况下,该操作将以“ Make published ”的形式出现在操作列表中,就是函数名,下划线将由空格替换。为了让这个方法更容易被人了解,我们可以给它添加一个 short_description 属性。

def make_published(modeladmin, request,queryset):

queryset.update(status='p')

make_published.short_description ="Markselected stories as published"

如何轻松了解 Python 必学的 django 框架?  Django 第5张

添加 action 到 ModelAdmin完整程序如下:

from django.contrib import admin

from myapp.models import Article

defmake_published(modeladmin, request, queryset):

queryset.update(status='p')

make_published.short_description ="Markselected stories as published"

classArticleAdmin(admin.ModelAdmin):

list_display = ['title', 'status']

ordering = ['title']

actions = [make_published]

admin.site.register(Article, ArticleAdmin)

效果如下:

如何轻松了解 Python 必学的 django 框架?  Django 第6张

如何轻松了解 Python 必学的 django 框架?  Django 第7张

处理 action 中的错误如果在自定义的 actions 中可能发生错误,需要捕获这些错误并调用 django.contrib.admin.ModelAdmin.message_user 来向用户显示错误消息。

如何轻松了解 Python 必学的 django 框架?  Django 第8张

将 action 定义为 ModelAdmin 的内部方法上述定义的 action 存在一个不足之处就是它和 Article 对象紧密耦合,这会导致大量的重复代码出现,即使这些 action 的功能都相同。将 action 定义为 ModelAdmin 的方法可以避免出现这个问题。

修改上述 ArticleAdmin:

class ArticleAdmin(admin.ModelAdmin):

actions = ['make_published']

def make_published(self, request, queryset):

queryset.update(status='p')

make_published.short_description ="Mark selected stories aspublished"

注意 make_published 变为 ArticleAdmin 的内部方法,第一个参数变为了 self。将 action 变为 ModelAdmin 的方法,使得它可以调用任何admin 提供的方法。例如向用户发送消息:

class ArticleAdmin(admin.ModelAdmin):

def make_published(self, request, queryset):

rows_updated = queryset.update(status='p')

if rows_updated ==1:

message_bit ="1 story was"

else:

message_bit ="%s stories were"%rows_updated

self.message_user(request, "%s successfully marked as published."%message_bit)

这使得 action 执行成功之后自动将 action 的行为和 admin 站点的行为相匹配。

效果如下:

如何轻松了解 Python 必学的 django 框架?  Django 第9张

如何轻松了解 Python 必学的 django 框架?  Django 第10张

提供中间页的 action在一些情况下,action 需要提供一个中间页来提示用户是否确认执行操作,比如删除对象时提醒用户是否确认执行操作:

如何轻松了解 Python 必学的 django 框架?  Django 第11张

要提供中间页,只需要返回一个 文件的操作:

from django.core import serializers

from django.

defexport_as_json(modeladmin, request, queryset):

response = ")

serializers.serialize("json", queryset, stream=response)

return response

但是这样可能会使 action 的逻辑非常复杂,推荐做法是返回一个 中充满复杂的逻辑。

from django.contrib import admin

fromdjango.contrib.contenttypes.models import ContentType

from django.

defexport_selected_objects(modeladmin, request, queryset):

selected =request.POST.getlist(admin.ACTION_CHECKBOX_NAME)

ct = ContentType.objects.get_for_model(queryset.model)

return )))

如何轻松了解 Python 必学的 django 框架?  Django 第12张

让 actions 在整个站点中都有效如果想要让上述中的导出操作在整个管理站点中都能使用,可以这样做:

from django.contrib import admin

admin.site.add_action(export_selected_objects)

为了方便管理这个操作,比如使用代码移除这个操作,可以给它一个名称

from django.contrib import admin

admin.site.add_action(export_selected_objects,"export_selected")

如何轻松了解 Python 必学的 django 框架?  Django 第13张

禁用 action禁用站点范围作用的的 action:

admin.site.disable_action('delete_selected')

这将在整个管理站点范围内禁用该 action。

如果需要复用已经禁用的 action。只需要在相应的 ModelAdmin 的actions 属性中添加这个 action即可。例如复用上述禁用的 action:

# This one will

classAnotherModelAdmin(admin.ModelAdmin):

actions = ['delete_selected']

在某个 ModelAdmin 中禁用所有的 action,只需要将 action 属性设置为None 即可。

class MyModelAdmin(admin.ModelAdmin):

actions =None

如何轻松了解 Python 必学的 django 框架?  Django 第14张

有条件的启用或者禁用 action通过重写 ModelAdmin的get_actions 方法可以实现有条件的启用或者禁用 action。该方法返回一个允许使用的 actions 字典,键是操作名称,值是(函数、名称、short_description)元组。例如,如果您只希望名称以“J”开头的用户能够批量删除对象:

class MyModelAdmin(admin.ModelAdmin):

def get_actions(self, request):

actions =super.get_actions(request)

if request.user.username[0].upper !='J':

if'delete_selected'in actions:

del actions['delete_selected']

return actions

如何轻松了解 Python 必学的 django 框架?  Django 第15张

设置 action 的权限action 可以通过设置 allowed_permissions 属性来限制具有特定权限的用户的可用性:

efmake_published(modeladmin, request, queryset):

queryset.update(status='p')

make_published.allowed_permissions = ('change',)

如果 allowed_permissions 具有多个权限,则只要用户通过至少一个权限检查,该操作就可用。allowed_permissions 可用值为:

• add

• change

• delete

• view

如果需要指定其他值,需要在ModelAdmin中定义一个has<value>\permission( self, request )方法,例如:

from django.contrib import admin

from django.contrib.auth import get_permission_codename

classArticleAdmin(admin.ModelAdmin):

actions = ['make_published']

def make_published(self, request, queryset):

queryset.update(status='p')

make_published.allowed_permissions = ('publish',)

def has_publish_permission(self, request):

"""Does the user have the publishpermission?"""

opts =self.opts

codename = get_permission_codename('publish', opts)

return request.user.has_perm('%s.%s'% (opts.app_label, codename))

最后附上官方文档地址:/

作者简介:单雨,90 后工科男,伪文艺青年。目前就读于北京理工大学宇航系,喜欢研究 AI,网络爬虫,微信小程序以及机器人,痴迷于 Coding,睡前必撸码。

【END】

如何轻松了解 Python 必学的 django 框架?  Django 第16张

评论列表暂无评论
发表评论
微信