Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django后台管理之Admin actions自定义

Django后台管理之Admin actions自定义

作者头像
菲宇
发布于 2019-08-14 03:03:56
发布于 2019-08-14 03:03:56
2.3K00
代码可运行
举报
文章被收录于专栏:菲宇菲宇
运行总次数:0
代码可运行

通常情况下,admin的工作模式是“选中目标,然后修改目标”,但在同时修改大量目标的时候,这种模式就变得重复、繁琐。

为此,admin提供了自定义功能函数actions的手段,可以批量对数据进行修改。admin内置了一个批量删除对象的操作,如下图所示:

下面以一个新闻应用的文章模型为例,介绍一个批量更新的自定义actions,它将选择的文章由“草稿”状态更新为“发布”状态:

首先是模型的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models

STATUS_CHOICES = (
    ('d', 'Draft'),
    ('p', 'Published'),
    ('w', 'Withdrawn'),
)

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    status = models.CharField(max_length=1, choices=STATUS_CHOICES)

    def __str__(self):              # __unicode__ on Python 2
        return self.title

一、编写action

action必须携带三个参数:

  • 当前的ModelAdmin
  • 当前的HttpRequest对象(即request)
  • 被选择的对象(即QuerySet)

在应用中的admin.py文件中写入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def make_published(modeladmin, request, queryset):
    queryset.update(status='p')

注意:这里我们作为例子,简单地使用了queryset自带的update()方法,它能批量操作。但在多数情况下,你要自己遍历queryset的每个元素,并编写具体的操作。也就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for obj in queryset:
    do_something_with(obj)

还可以设置一个简单易懂的简短描述(可以使用中文),用于代替生硬的函数名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def make_published(modeladmin, request, queryset):
    queryset.update(status='p')
# 注意缩进,下面这句不在函数体内。
make_published.short_description = "Mark selected stories as published"

二、将自定义action添加到对应的ModelAdmin中

关键是其中的actions = [make_published]这句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from myapp.models import Article

def make_published(modeladmin, request, queryset):
    queryset.update(status='p')
make_published.short_description = "Mark selected stories as published"

class ArticleAdmin(admin.ModelAdmin):
    list_display = ['title', 'status']
    ordering = ['title']
    actions = [make_published]

admin.site.register(Article, ArticleAdmin)

然后,页面看起来是下面的样子(注意下拉框):

处理错误

这其中,如果你能够预知在自定义的操作中可能产生的错误,请处理该错误,并通过django.contrib.admin.ModelAdmin.message_user()以友好的方式给予用户提示信息。

三、将action定义为ModelAdmin的方法

上面的make_published看起来已经不错了,但是我们一般会将它作为ModelAdmin的方法来使用。下面我们把它移到ArticleAdmin类中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ArticleAdmin(admin.ModelAdmin):
    ...

    actions = ['make_published']  # 请注意这里改成字符串引用了
    # 第一个参数变为self
    def make_published(self, request, queryset):
        queryset.update(status='p')
    make_published.short_description = "Mark selected stories as published"

这样做的好处是自定义方法可以直接访问类本身。例如下面使用self引用,为方法添加提示信息的功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

回到浏览器,再试试,你会看到如下图所示(注意顶部的绿色提示行):

四、跳转到中间页面

默认情况下,执行完actions后,浏览器会返回先前的修改列表页面。但有时候,一些复杂的action需要返回中间页面,例如内置的删除方法,在执行删除动作之前,会弹出一个删除确认页面。

要实现这个功能,只需要在action方法中返回一个HttpResponse(或它的子类)。 例如下面是一个利用Django内置的序列化函数将一个对象保存为json格式的范例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.http import HttpResponse
from django.core import serializers

def export_as_json(modeladmin, request, queryset):
    response = HttpResponse(content_type="application/json")
    serializers.serialize("json", queryset, stream=response)
    return response

多数情况下,我们会使用HttpResponseRedirect跳转到一个中间页面,并在GET方法的url中携带别选择的对象作为参数传递过去,然后在这个新的视图中接收这个参数,并编写具体的更加复杂的业务逻辑,如下面的代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponseRedirect

def export_selected_objects(modeladmin, request, queryset):
    # 获得被打钩的checkbox对应的对象
    selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
    # 获取对应的模型
    ct = ContentType.objects.get_for_model(queryset.model)
    # 构造访问的url,使用GET方法,跳转到相应的页面
    return HttpResponseRedirect("/export/?ct=%s&ids=%s" % (ct.pk, ",".join(selected)))

具体的业务views这里没有给出,作为练习,留给大家。

五、编写可用于整个admin站点的action

前面创建的actions智能应用于绑定的模型。实际上有时候,我们还需要可以对admin站点内所有模型都有效的acitons。上面写的export_selected_objects函数可以是一个很好的例子。要实现这一功能,你需要使用内置的AdminSite.add_action方法:

AdminSite.add_action(action, name=None)[source]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin

admin.site.add_action(export_selected_objects)

六、禁用acitons

有时候,对于某些actions,我们想全局禁用或者局部禁用它。需要使用AdminSite.disable_action(name)方法。

  • 禁用全站级别的acitons:

例如,禁用内置的删除方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
admin.site.disable_action('delete_selected')
  • 全站禁用,但个别可用:在ModelAdmin.actions中显式地引用。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 全站禁用删除功能
admin.site.disable_action('delete_selected')

# 这个老老实实的被禁了
class SomeModelAdmin(admin.ModelAdmin):
    actions = ['some_other_action']
    ...

# 这个声明:我还要用
class AnotherModelAdmin(admin.ModelAdmin):
    actions = ['delete_selected', 'a_third_action']
    ...
  • 在指定模型中禁用所有actions:设置ModelAdmin.actions为None。(这会连带全局actions一起禁用了。)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class MyModelAdmin(admin.ModelAdmin):
        actions = None
  • 根据条件自动启用或禁用:

还可以根据条件自动选择性的启动或禁用某些acitons,你只需要改写ModelAdmin.get_actions()方法。

该方法将返回一个包含actions的字典。字典的键是aciton的名字(也就是前面的'delete_selected', 'a_third_action'之类),值是一个元组,包含(函数、名字、别名)

例如,允许用户名以“J”开头的用户批量删除对象,但其它用户不行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyModelAdmin(admin.ModelAdmin):
    ...

    def get_actions(self, request):
        actions = super(MyModelAdmin, self).get_actions(request)
        if request.user.username[0].upper() != 'J':
            if 'delete_selected' in actions:
                del actions['delete_selected']
        return actions
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年08月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
django 1.8 官方文档翻译:7-2 管理操作
简而言之,Django管理后台的基本流程是,“选择一个对象并改变它”。在大多数情况下,这是非常适合的。然而当你一次性要对多个对象做相同的改变,这个流程是非常的单调乏味的。
ApacheCN_飞龙
2022/11/27
7860
django 1.8 官方文档翻译:7-2 管理操作
Django Admin后台管理:高效开发与实践
title: Django Admin后台管理:高效开发与实践 date: 2024/5/8 14:24:15 updated: 2024/5/8 14:24:15 categories:
用户6256742
2024/06/12
5210
Django之admin管理工具
  若要把app应用显示在后台管理中,需要在admin.py中注册。有两种方式注册
py3study
2020/01/21
5010
Django 进阶学习 - 动态actions
Django后台默认只有一个动作Delete selected xxxxs, 那么如果自定义动作该怎么办, 也很容易, 直接写个类似于这种的函数
用户1416054
2018/08/02
4280
Django 进阶学习 - 动态actions
Django Admin 后台自定制技巧
Django最强大的部分之一是自动管理界面。它从模型中读取元数据,以提供一个快速的,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容。管理员的建议用法仅限于组织的内部管理工具。它并非旨在构建您的整个前端。
王瑞MVP
2022/12/28
1.5K0
Django Admin 后台自定制技巧
Django Admin后台定制简单监控页
我们使用Django的Admin二次定制一个图形化界面,首先我们把语言设置为中文简体.
王瑞MVP
2022/12/28
3760
Django Admin后台定制简单监控页
Django--admin源码流程
admin.py from django.contrib import admin from . import models """ 通过原生的django admin来创造数据 """ admin.site.register(models.User) admin.site.register(models.Role) admin.site.register(models.Permission) admin.site.register(models.Group) admin.site.register(mod
用户1214487
2018/01/24
9960
django admin 对 list_filter 排序
1. https://cloud.tencent.com/developer/ask/34273
卓越笔记
2023/02/18
5340
django  admin 对 list_filter 排序
Django之admin的使用和源码剖析
admin组件使用 Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'djan
人生不如戏
2018/05/30
2.2K0
使用 Django 的 admin 定制后台,丰富自己网站的后台管理系统
Django 自身带有一个功能强大的后台管理系统,这算是 Django 与其他的 Python 的 web 框架相比最大的一个优势吧!通过使用一些 admin 自带的参数,可以定制出一套非常丰富的后台管理系统。这篇文章就来通过我的博客的实例介绍一下我认为比较实用的 admin 参数设置。
Hopetree
2022/09/26
3.4K0
使用 Django 的 admin 定制后台,丰富自己网站的后台管理系统
django import_export 个性化可视化导出外键字段
models.py class Article(models.Model): """ 主题表/文章表 """ title = models.CharField(max_length=128, unique=True, verbose_name="标题", help_text="请填写标题") slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符") content =
卓越笔记
2023/02/18
7890
Django快速入门——投票程序(7) 自定义后台
通过admin.site.register(Question)注册Question模型,Django会创建默认的表单在后台显示。但有时需要自定义后台的显示,可以通过继承admin.ModelAdmin实现:
一只大鸽子
2023/09/02
3090
Django快速入门——投票程序(7) 自定义后台
Django-admin组件
Django 如何使用admin组件来对后台数据进行管理的? 在每个app下的admin.py文件中进行注册: from app名.models import 模型类名 from django.contrib import admin admin.site.register(模型类名) class 自定义配置类名(admin.ModelAdmin): list_display = ["字段名1","字段名1"]
py3study
2020/01/19
1.8K0
Django-admin组件
【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)
在实际中,我们希望直接通知最近需要面试候选人得面试官,所以我们为应聘者添加一个action,被选中得应聘者可以直接发送到对应一面或二面面试官。
计算机魔术师
2022/08/19
4700
【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)
自定义 Django 管理界面中的多对多内联模型
在 Django 管理界面中,用户可以使用内联模型来管理一对多的关系。但是,当一对多关系是多对多时,Django 提供的默认内联模型可能并不适合。例如,如果存在一个产品模型和一个发票模型,并且产品和发票之间是多对多的关系,那么在发票的管理界面中,Django 会显示一个表格,其中包含所有产品及其对应的复选框。这种形式的内联模型对于管理少量产品还可以接受,但是如果产品数量很多,那么这种内联模型就会非常不美观和难以使用。
用户11021319
2024/06/26
3340
自定义 Django 管理界面中的多对多内联模型
Django admin管理工具
Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:
py3study
2020/01/20
1.1K0
Django-admin管理工具
admin组件使用 Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'djan
新人小试
2018/06/13
2.1K0
django admin后台模块
1、创建超级用户: python manage.py createsuperuser 2、在admin.py中注册可以管理的数据库
用户5760343
2022/05/14
5420
django admin后台模块
Django admin管理工具的使用、定制及源码解析
Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:
菲宇
2019/06/12
4.2K0
Django admin管理工具的使用、定制及源码解析
Django 1.10中文文档-第一个应用Part7-自定义管理站点
目录[-] 开发第一个Django应用,Part7 本教程上接Part6。将继续完成这个投票应用,本节将着重讲解如果用Django自动生成后台管理网站。 自定义管理表单 通过admin.site.register(Question)注册了Question后,Django可以自动构建一个默认的表单。如果您需要自定义管理表单的外观和功能。你可以在注册时通过配置来实现。 现在先来试试重新排序表单上的字段。只需要将admin.site.register(Question)所在行替换为: # polls/admi
jhao104
2018/03/20
3.8K0
Django 1.10中文文档-第一个应用Part7-自定义管理站点
相关推荐
django 1.8 官方文档翻译:7-2 管理操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验