自定义 admin action
添加Action到 ModelAdmin
Model
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
admin
from django.contrib import admin from myapp.models import Article class ArticleAdmin(admin.ModelAdmin): list_display = ['title', 'status'] ordering = ['title'] actions = ['make_published'] def make_published(self, request, queryset): queryset.update(status='p') make_published.short_description = "Mark selected stories as published" admin.site.register(Article, ArticleAdmin)
这段代码向我们提供的Admin 更改列表看起来像这样:
Action高级技巧
message_user()通知消息
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 运行时发生可预见的些错误,你应该以优雅的方式向用户通知这些错误。这意味着处理异常并使用django.contrib.admin.ModelAdmin.message_user()在响应中向用户展示友好的问题描述.
def make_category_duanzi(self, request, queryset): try: rows_updated = queryset.update(category="abc") if rows_updated == 1: message_bit = "1 story was" else: message_bit = "%s stores were" % rows_updated self.message_user(request, "%s successfully marked as 段子." % message_bit) except Exception as e: self.message_user(request, e) make_category_duanzi.short_description = "Mark selected news as 段子"
在整个站点应用action
AdminSite.add_action(action[, name])
如果一些操作对管理站点的任何对象都可用的话,是非常不错的 -- 上面所定义的导出操作是个不错的备选方案.
from django.contrib import admin admin.site.add_action(export_selected_objects)
禁用整个站点的操作
- AdminSite.disable_action(name)
-
如果你需要禁用站点级操作 ,你可以调用 AdminSite.disable_action()。
例如,你可以使用这个方法来移除内建的“删除选中的对象”操作:
admin.site.disable_action('delete_selected')
为特定的ModelAdmin禁用所有操作 ModelAdmin
如果你想批量移除所提供 ModelAdmin上的所有操作,可以把ModelAdmin.actions设置为None:
class MyModelAdmin(admin.ModelAdmin): actions = None
按需启用或禁用操作
- ModelAdmin.get_actions(request)
-
最后,你可以通过覆写ModelAdmin.get_actions(),对每个请求(每个用户)按需开启或禁用操作。
这个函数返回包含允许操作的字典。字典的键是操作的名称,值是 (function, name, short_description)元组。
多数情况下,你会按需使用这一方法,来从超类中的列表移除操作。例如,如果我只希望名称以'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