使用一个函数对选中的条路做统一的改变。三个参数:
The current ModelAdminAn HttpRequest representing the current request,A QuerySet containing the set of objects selected by the user.
from django.db import modelsSTATUS_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) # On Python 3: def __str__(self): def __unicode__(self): return self.titlefrom django.contrib import adminfrom myapp.models import Articledef 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)
但是因为actions和这个Admin是紧耦合的,所以我们把这个函数当做方法卸载Admin内部
actions = ['make_published']def make_published(self, request, queryset): queryset.update(status='p')make_published.short_description = "Mark selected stories as published"
这里在actions中使用了字符串代替了上面的函数名,表示在make_published是方法。
使用self.message_user来对用户进行提示
使用action来提供一个中间页直接返回一个响应
from django.http import HttpResponsefrom django.core import serializersdef export_as_json(modeladmin, request, queryset): response = HttpResponse(content_type="application/json") serializers.serialize("json", queryset, stream=response) return response
或者重定向
from django.contrib import adminfrom django.contrib.contenttypes.models import ContentTypefrom django.http import HttpResponseRedirectdef export_selected_objects(modeladmin, request, queryset): selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME) ct = ContentType.objects.get_for_model(queryset.model) return HttpResponseRedirect("/export/?ct=%s&ids=%s" % (ct.pk, ",".join(selected)))
将actions作用于全站,第二个参数是名字.
admin.site.add_action(export_selected_objects, 'export_selected')
禁用actions
admin.site.disable_action('delete_selected')#禁用了自带的删除admin.site.disable_action('delete_selected') class SomeModelAdmin(admin.ModelAdmin): actions = ['some_other_action'] ...class AnotherModelAdmin(admin.ModelAdmin): actions = ['delete_selected', 'a_third_action'] ...
actuions只是ModelAdmin的一个字段,如果想禁用一个ModelAdmin的所有actions
class MyModelAdmin(admin.ModelAdmin): actions = None
如果想对用一个ModelAdmin下的不用字段或者同一字段对不用用户使用不同的actions,那么就覆盖掉get_actions方法.
返回一个允许的actions字典,keys是action的名字,value是一个(function,name,short_description)的元组.
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 Admin actions, 感谢原作者分享。 读书破万卷,下笔如有神。