Django Admin 自定义 Action 添加与配置详解
本文详解如何在 Django Admin 后台添加自定义 Action,包括在 ModelAdmin 内部定义、处理函数编写、返回自定义页面以及全站统一配置 Action。同时介绍如何禁用默认或特定 Action,并根据用户角色动态控制可见性,帮助开发者高效管理后台数据。
Django Admin 默认指令与自定义需求
Django 自带的 admin 后台提供了一系列默认指令,用于对数据进行批量操作,例如批量删除或修改。

除了系统默认指令外,开发者还可以根据需求添加自定义指令。
项目初始化与基础配置
首先需要创建一个 Django 项目。
$ django-admin startproject DjangoActions
$ cd DjangoActions
$ python3 manage.py startapp mysite添加model
接着打开 mysite 应用下的 models.py 文件,定义数据模型。
from django.db import models
class Article(models.Model):
# 文章状态,类似枚举
STATUS_CHOICES = (
('d', '草稿'),
('p', '发布'),
)
# 标题
title = models.CharField(max_length=30)
# 内容
body = models.TextField()
# 状态
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='d')
def __str__(self):
return self.title将Article注册到admin
然后打开 mysite 应用下的 admin.py 文件,配置后台管理逻辑。
from django.contrib import admin
from .models import Article
# 指令处理函数,参数固定写法
def make_article_published(modeladmin, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合
actions = [make_article_published]启动服务
第一步是同步数据库结构。
$ python3 manage.py makemigrations
$ python3 manage.py migrate
第二步是创建一个超级用户以访问后台。
$ python3 manage.py createsuperuser按照提示操作即可
第三步是启动 Django 开发服务器。
$ python3 manage.py runserver
以下是操作效果的展示。
首先,点击 MYSITE 下 Articles 右侧的 add 按钮添加一篇文章。保存后会自动跳转至文章列表页面。
接着,点击 Action 下拉菜单中的 option 选项。

此时可以看到我们自定义的 action 已经成功添加进列表。
可以尝试勾选文章前的复选框,然后执行该操作将其标记为已发布。
在 ModelAdmin 内部定义 Action
将 action 定义封装在 ModelAdmin 类内部是一种更规范的写法。
虽然之前已经成功添加了自定义 action,但将其定义在类外部不够直观,也不符合面向对象封装原则。因此我们需要对代码进行优化。
from django.contrib import admin
from .models import Article
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合 修改为字符串
actions = ['make_article_published']
# 指令处理函数,参数固定写法
def make_article_published(self, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 操作完成后的提示信息
self.message_user(request, '修改成功')
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
重启服务器后再次执行状态修改,操作依然成功,并且会显示自定义的提示信息。

自定义 Action 跳转页面
接下来介绍如何跳转到中间页面。
Django 默认在执行完动作后会返回当前页面并刷新。如果需要自定义跳转目标,只需在动作函数中返回 HttpResponse 对象即可。
具体实现涉及 views.py 的配置。
from django.shortcuts import render
def success(request):
return render(request, 'success.html')
DjangoActions/urls.py
from mysite.views import success
urlpatterns = [
path('admin/', admin.site.urls),
path('success/', success, name='success'),
]
templates/success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
success
</body>
</html>
mysite/admin.py
from django.contrib import admin
from .models import Article
from django.shortcuts import redirect
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合 修改为字符串
actions = ['make_article_published']
# 指令处理函数,参数固定写法
def make_article_published(self, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 此处使用的转发,一可以直接使用HttpResponse
return redirect('success')
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
再次尝试修改状态,成功后页面将跳转至指定的 success 页面。

全站 Action 配置与管理
除了针对单个模型,还可以配置全站通用的 action。
有时为了方便管理,希望整个站点的所有模型都拥有相同的动作。如果为每个 ModelAdmin 单独编写一遍代码显得冗余,可以通过配置全站级别的 action 来解决这一问题。
具体使用方式如下。
from django.contrib import admin
admin.site.add_action(make_article_published)
此外,还可以根据需要禁用特定的 action。
若要禁用全站级别的 actions,可以使用以下方法。
# 禁用默认的删除
admin.site.disable_action('delete_selected')
全站禁用,个别可用 启用了全站禁用,某个又想使用怎么办,只需单独添加到actions里面就可以了
# 禁用默认的删除
admin.site.disable_action('delete_selected')
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合
actions = ['delete_selected']
如果在指定模型中将 actions=None,则该模型的所有 action 都将不可用,包括系统默认的指令。
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合
actions = None
还可以根据条件自动启用或禁用 action,以实现更精细的权限控制。
#将Article注册到后台
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# 后台列表展示的字段
list_display = ('title', 'status')
# 动作集合 修改为字符串
actions = ['make_article_published']
# 指令处理函数,参数固定写法
def make_article_published(self, request, queryset):
# queryset 是从数据库查询到的model set
# 更新status状态为p,在此处就是Article
queryset.update(status='p')
# 此处使用的转发,一可以直接使用HttpResponse
return redirect('success')
# 重写此方法,做出判断即可
def get_actions(self, request):
actions = super(ArticleAdmin, self).get_actions(request)
if request.user.username[0].upper() != 'SuperUser':
if 'delete_selected' in actions:
del actions['delete_selected']
return actions
# 此指令的名称
make_article_published.short_description = '更改状态为发布'
本文总结了 Django 给 admin 添加 Action 的多种方法。
以上介绍了 Django 给 admin 添加 Action 的实例详解,希望对大家有所帮助。如有疑问请留言,小编会及时回复。感谢大家对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









