django后台管理--添加自定义action
管理员动作
简单来说,Django管理员的基本工作流程是“选择一个对象,然后进行更改”。这对大多数用例都很有效。 然而当你一次性要对多个对象做相同的改变,这个流程是非常的单调乏味的。
在这些情况下,Django Admin 可以让你编写并注册“Action” —— 仅仅只是一个以更改列表页面上选中对象的列表为参数的回调函数。
django自带了一个删除操作的动作:
通过官网的一个实例来说明自定义action的用法:
任务的目标: 批量操作,把文章的状态更新为已发布
#一个数据库模型如下
STATUS_CHOICES = (
('d', 'Draft'),
('p', 'Published'),
('w', 'Withdrawn'),
) class Article(models.Model):
title = models.CharField(max_length=50)
body = models.CharField(max_length=300)
editor = models.CharField(max_length=30, null=True)
status = models.CharField(max_length=1, choices=STATUS_CHOICES) def __unicode__(self):
return self.title
编写action
首先,我们需要定义一个函数,当在Admin 界面上触发该Action 的时候调用。 Action 函数,跟普通的函数一样,需要接收三个参数:
- 当前的
ModelAdmin
- 表示当前请求的
HttpRequest
- 含有用户所选的对象集合的
QuerySet
def make_published(modeladmin, request, queryset):
queryset.update(status='p') make_published.short_description = "Mark selected stories as published" class ArticleAdmin(admin.ModelAdmin):
actions_on_top = True
actions_selection_counter = True
list_display = ["title", "body", "editor", "status"]
actions = [make_published] #make_published.short_description,下垃操作中默认是展示make_published,定义short_description可以以一种友好的方式展示。
前端展示如下:
处理错误:
这其中,如果你能够预知在自定义的操作中可能产生的错误,请处理该错误,并通过django.contrib.admin.ModelAdmin.message_user()
以友好的方式给予用户提示信息。
将action定义为modeladmin的方法:
上面的例子展示了定义为一个简单函数的make_published
操作。 这真是极好的,但是以视图的代码设计角度来看,它并不完美:由于操作与Article
紧密耦合,不如将操作直接绑定到ArticleAdmin
对象上更有意义。
我们上面定义的make_published方法,第一个参数是modeladmin对象,把要操作的modeladmin对象作为参数传递给make_published。
class ArticleAdmin(admin.ModelAdmin):
actions_on_top = True
actions_selection_counter = True
list_display = ["title", "body", "editor", "status"] def make_published(self, request, queryset):
queryset.update(status='d') make_published.short_description = "Mark selected stories as published"
actions = [make_published]
这样做的好处是自定义方法可以直接访问类本身。例如下面使用self引用,为方法添加提示信息的功能:下面加入了一些提示信息:
class ArticleAdmin(admin.ModelAdmin):
actions_on_top = True
actions_selection_counter = True
list_display = ["title", "body", "editor", "status"] def make_published(self, request, queryset):
rows_updated = queryset.update(status='d')
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) make_published.short_description = "Mark selected stories as published"
actions = [make_published]
展示如下:
跳转中间页面
把操作的数据跳转到另一个视图界面,然后进行操作。
默认情况下,执行完actions后,浏览器会返回先前的修改列表页面。但有时候,一些复杂的action需要返回中间页面,例如内置的删除方法,在执行删除动作之前,会弹出一个删除确认页面。
要实现这个功能,只需要在action方法中返回一个HttpResponse(或它的子类)。 例如下面是一个利用Django内置的序列化函数将一个对象保存为json格式的范例:
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中携带别选择的对象作为参数传递过去,然后在这个新的视图中接收这个参数,并编写具体的更加复杂的业务逻辑,如下面的代码所示:
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)))
编写可用于整个admin站点的action
前面创建的actions智能应用于绑定的模型。实际上有时候,我们还需要可以对admin站点内所有模型都有效的acitons。上面写的export_selected_objects
函数可以是一个很好的例子。要实现这一功能,你需要使用内置的AdminSite.add_action
方法:
from django.contrib import admin admin.site.add_action(export_selected_objects)
禁用action
有时候,对于某些actions,我们想全局禁用或者局部禁用它。需要使用AdminSite.disable_action(name)方法。
- 禁用全站级别的acitons:
例如,禁用内置的删除方法:
admin.site.disable_action('delete_selected')
- 全站禁用,但是个别可用: 在ModelAdmin.actions中显式地引用。
# 全站禁用删除功能
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一起禁用了。)
class MyModelAdmin(admin.ModelAdmin):
actions = None - 根据条件自动启用或禁用:
还可以根据条件自动选择性的启动或禁用某些acitons,你只需要改写
ModelAdmin.get_actions()
方法。该方法将返回一个包含actions的字典。字典的键是aciton的名字(也就是前面的'delete_selected', 'a_third_action'之类),值是一个元组,包含(函数、名字、别名)
例如,允许用户名以“J”开头的用户批量删除对象,但其它用户不行:
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
django后台管理--添加自定义action的更多相关文章
- django后台管理-admin
0922自我总结 django后台管理-admin 一.模型注册 admin.py 注册方式一: #在对于注册的app中的admin文件中导入模型然后注册模型 admin.site.register( ...
- Django——后台管理
1.要使用Django-admin后台的前提 INSTALLED_APPS = [ 'simpleui', 'django.contrib.admin', #必须有这一项 'django.contri ...
- Django后台管理的使用
Django后台管理的使用 参考文章:https://www.runoob.com/django/django-admin-manage-tool.html 1.编写好models 直接在admin. ...
- Django 后台管理 之登录和注销
Session: session是服务器端生成保存的一个键值对 , session内部机制依赖于cookie . 用户登录后返回给客户端一个随机字符串,客户端带着随机字符串访问服务器,用于验证 ...
- Django后台管理界面
之前的几篇记录了模板视图.模型等页面展示的相关内容,这篇主要写一下后台admin管理界面的内容. 激活管理界面 Django管理站点完全是可选择的,之前我们是把这些功能给屏蔽掉了.记得上篇中Djang ...
- django后台管理-ModelAdmin对象
Django最强大的部分之一是自动生成的管理后台界面. 它从你的模型中读取元数据,以提供一个快速的.以模型为中心的界面,信任的用户可以在这里管理你网站上的内容. 建议管理后台仅作为组织的一个内部管理工 ...
- 强大的Django后台管理
Django 后台 django的后台我们只要加少些代码,就可以实现强大的功能.与后台相关文件:每个app中的 admin.py 文件与后台相关 下面示例是做一个后台添加博客文章的例子: 新建一个 名 ...
- [oldboy-django][1初始django]后台管理页面的布局 + djano母版(继承html)
完善学员管理系统 - bootstrap fontawesome - 分页,路径导航,表格(class样式),消息图标(i标签),邮件图标(i标签) - 响应式导航 @media(min-width, ...
- django后台管理
后台管理 1) 本地化 语言和时区的本地化. 修改settings.py文件. # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' # TIME_ ...
随机推荐
- Spark创建空的DataFrame
前言 本文主要给出Spark创建空的DataFrame的代码示例,这里讲的空的DataFrame主要指有列名(可以自己随意指定),但是没有行的DataFrame,因为自己在开发过程中有这个需求,之前并 ...
- Jmeter测试报告
服务器: 2个CPU,每个CPU 1个核,4G内存 20G硬盘 客户端(Jmeter):2个CPU,每个2个核,4+8内存 500G硬盘 ---------------------------- ...
- Linux更改IP地址
1.进入到root用户 2.执行命令:ifconfig 查看本机的名称 3.执行命令:ifconfig eth0 192.168.25.128 netmask 255.255.255.0 //eth ...
- jenkins 实现多用户同时触发任务 + 修改job的config.xml 不重启服务生效
(后期添加: 这篇博客是在刚研究并发构建时写的,所以方法比较老套,采用的时流水线(pipeline)的方式,实现时通过如果job的用户配置来创建多个新的执行任务的job,并且将执行日志回收到入口job ...
- zyb的面试(广工14届比赛)
这道题目在上半年ZOJ模拟上年青岛赛区ACM题的时候就已经出现了.当时我不会写,本来想着赛后补题的最后因为懒惰又没补. 现在这道题又出现了.这是上天对我的惩罚啊!!! 所以这次铁了心也要补这题.然后我 ...
- php __FILE__ symlink
定义 __FILE__ 是一个魔法变量(预定义常量),当前运行文件的完整路径(真是文件路径,非软链路径)和文件名.如果用在被包含文件中,则返回被包含的文件名. 官方解释: __FILE__ 文件的 ...
- 家庭记账本之微信小程序(一)
记得ppt中说到,可以制作为微信小程序或者是安卓的应用,但是在我了解后觉得小应用有点力不从心,所以还是从微信小程序开始吧,先让我们了解一下主要的东西 1.准备工作 IDE搭建2.知识准备从零开始app ...
- 《2017年Q2中国城市研究报告
根据百度慧眼团队发布的<2017年Q2中国城市研究报告>,2017年第二季度人口吸引力排名前五的城市与第一季度相同,深圳继续保持第一的领先位置.
- vue中使用导出表格功能
1.下载依赖 npm install -S file-saver xlsx npm install -D script-loader 2.在src下创建vendor文件夹,并在文件夹中放两个文件 Bl ...
- webpack使用三
Webpack的强大功能 生成Source Maps(使调试更容易) 开发总是离不开调试,方便的调试能极大的提高开发效率,不过有时候通过打包后的文件,你是不容易找到出错了的地方,对应的你写的代码的位置 ...