iblogc

Django admin 笔记

2016-05-20 · 4 min read
Django

管理站点

注册模型到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上的所有操作的有序字典,keyactionname(不是short_description),value(function, name, short_description)元组
short_description只是用来给人类看的,所以不太会用作参数

Powered by Gridea && Deployed by 部署状态