admin
from django.contrib import admin
from myproject.myapp.models import Author
admin.site.register(Author)
或是使用装饰器
from django.contrib import admin
from myproject.myqll.models import Author
@admin.register(Author[, Reader, Editor])
class PersonAdmin(admn.ModelAdmin):
pass
# 或
@admin.register
class PersonAdmin(admn.ModelAdmin):
model = Author
list_display
控制在管理的列表页面显示的字段
fields
控制在表单页面显示的字段、字段顺序及行内分组,如果字段在model
里设置了editable=False
,则只有当此字段在readonly_fields
中时,才能包含在fields
中;
exclude
控制在表单页面不需要显示的字段
在apps.py
里
from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _
class AuthorConfig(AppConfig):
name = 'myapp'
verbose_name = u'管理后台显示的名称'
```
在`__init__.py`加入
```python
default_app_config = 'myapp.apps.AuthorConfig'
ModelAdmin options
ModelAdmin.actions
列表, 列表页操作,详见下章
ModelAdmin.actions_on_top
ModelAdmin.actions_on_bottom
布尔值,列表页操作控件显示的位置,上面可同时显示
ModelAdmin.actions_selection_counter
布尔值,是否在列表页操作控件显示选中数量
ModelAdmin.date_hierarchy
时间类型字段名字符,列表页顶部可根据指定日期字段生成一个智能过滤条
ModelAdmin.empty_value_display
当字段值为None
、空字符时显示的替代内容,默认为 -
ModelAdmin.exclude
哪些字段在列表页中不显示
ModelAdmin.view_on_site
在站点上查看当前编辑的对象
默认使用get_absolute_url()
或可重写view_on_site(self, obj)
方法返回url
列表页批量操作
from django.contrib import admin
from myapp.models import Article
def make_published(modeladmin, request, queryset):
# queryset为用户所选的对象集合
queryset.update(status='p')
make_published.short_description = u'发布文章'
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'status']
ordering = ['title']
# 使用actions注册操作
actions = [make_published]
admin.site.register(Article, ArticleAdmin)
因为make_published
方法和Article
模型是紧密耦合的,所以为了更好的设计,应该把make_published
绑定到ArticleAdmin
里面去。
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)
操作的中间页面
只要从你的操作返回HttpResponse(或其子类)就可以了。
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
from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponseRedirect
def 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)))
全站操作
from django.contrib import admin
# 第二个参数为禁用时使用的名字,如果方法没有short_description,也会使用这个名字
admin.site.add_action(export_selected_objects,u'导出')
export_selected_objects
方法同前面相同
禁用全站操作
from django.contrib import admin
# 禁用时使用add_action时的name,如果没有,直接使用方法名字字符串
admin.site.disable_action(u'导出')
如果想要局部启用被全局禁用的操作可以显示的放到ModelAdmin.actions
列表中就可以
如果想要在某个ModelAdmin
上禁用所有操作,可以把ModelAdmin.actions
设置为None
,这会所有列表上的批量操作全部禁用,包括django
自带的操作,设置ModelAdmin.actions
为空list
并不能禁用全站级操作
根据每个请求来动态的开启或禁用操作
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
ModelAdmin.get_actions()
会返回当前ModelAdmin
上的所有操作的有序字典,key
为action
的name
(不是short_description
),value
为(function, name, short_description)
元组
short_description
只是用来给人类看的,所以不太会用作参数