Django Admin 自定义 Action 添加与配置详解

Chloe
Chloe
发布时间:2026-10-13| 1人浏览过
原创

本文详解如何在 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 的实例详解,希望对大家有所帮助。如有疑问请留言,小编会及时回复。感谢大家对本站的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。