自定义 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

 

posted @ 2017-06-09 16:00  Vincen_shen  阅读(586)  评论(0)    收藏  举报