Django Admin 全面设置

The Django admin site

Django中一个最强大的部分是自动管理接口,在模型中读取元数据来提供一个强大的、生产就绪的接口,使内容提供者能立即用它向站点中添加内容,在这篇文档中,我们讨论如何去激活,使用和自定义Django的站点管理接口。

1.概述

通过使用startproject创建的默认项目模版中,admin模块已准备就绪。

下面的一些要求作为参考:

  1. 添加 'django.contrib.admin'到INSTALLED_APPS 设置中.

  2. admin有四个依赖 - django.contrib.auth, django.contrib.contenttypes, django.contrib.messages 和django.contrib.sessions. 如果这些应用没有在 INSTALLED_APPS 列表中, 添加这些应用.

  3. 把 django.contrib.messages.context_processors.messages 添加到 DjangoTemplates后台定义在TEMPLATES中的'context_processors'选项,同样把django.contrib.auth.middleware.AuthenticationMiddleware 和 django.contrib.messages.middleware.MessageMiddleware 添加到 MIDDLEWARE_CLASSES. (这些默认都是激活的,所以如果你手工操作过的话就需要按照以上方法进行设置..)

  4. 确定你的哪些应用模块是可以在admin接口中被编辑的。

  5. 对于这些可在admin中被编辑的每一个模块,选择性的创建一个 ModelAdmin 类,它包含了为这些特定模块自定义的管理功能和选项

  6. 实例化AdminSite 并且告诉它你的每一个模块和ModelAdmin 类.

  7. 将AdminSite实例绑定到URLconf.

做了这些步骤之后, 你将能够使用Django管理站点通过访问你已经绑定的URL(/admin/, 默认的).

2.ModelAdmin objects

class ModelAdmin

ModelAdmin 类是admin接口中比较有代表性的模块。通常,这些被存放在应用中名为admin.py的文件里,让我们来看一个关于ModelAdmin类非常简单的例子:

from django.contrib import admin
from myproject.myapp.models import Author

class AuthorAdmin(admin.ModelAdmin):
    pass
admin.site.register(Author, AuthorAdmin)

你不需要一个ModelAdmin 对象吗?
在上面的例子中, ModelAdmin还没有定义一些自定义的值. 因此, 系统将使用默认的管理接口实现. 如果你满足于默认的admin接口, 你就根本不需要定义 ModelAdmin 对象了– 你可以直接注册模块类而无需提供 对ModelAdmin 描述。上面的例子可以简化成:

from django.contrib import admin
from myproject.myapp.models import Author

admin.site.register(Author)

2.1 注册装饰器

register(*models[, site=django.admin.sites.site])

New in Django 1.7.

还可以用一个装饰来注册您的ModelAdmin类(这里有关装饰器的情况可以参考python中的相关说明):

from django.contrib import admin
from .models import Author

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    pass

如果不使用默认的AdminSite,可以提供一个或多个模块类来注册ModelAdmin 并且一个选择性关键参数 site(这里使用装饰器来注册需要注册的类和模块的,请特别留意紧跟装饰器后面关于ModelAdmin的声明,前面是Author,后面是PersonAdmin,我的理解是后一种情况 下注册的类都可以用PersonAdmin来作为接口):

from django.contrib import admin
from .models import Author, Reader, Editor
from myproject.admin_site import custom_admin_site

@admin.register(Author, Reader, Editor, site=custom_admin_site)
class PersonAdmin(admin.ModelAdmin):
    pass

2.2 探索admin文件

当你将 'django.contrib.admin'加入到INSTALLED_APPS 设置中,Django就会自动搜索每个应用的admin模块并将其导入。

class apps.AdminConfig

New in Django 1.7.

这是 admin的默认AppConfig 类. 它在 Django 启动时调用autodiscover() .

class apps.SimpleAdminConfig

New in Django 1.7.

这个类和 AdminConfig的作用一样,除了它不调用autodiscover().

autodiscover()[source]
这个函数尝试在每一个已经安装的应用中导入 admin模块. 那些希望被注册使用admin的模块.

Changed in Django 1.7:
以前的Django版本推荐直接在URLconf中调用这个函数. Django 1.7不再需要这样. AdminConfig 能够自动的运行 auto-discovery.

如果你使用自定义的AdminSite, 一般是导入所有的ModelAdmin 子类到你的代码中并将其注册到自定义的AdminSite中. 在这种情况下, 为了禁用auto-discovery,在你的INSTALLED_APPS 设置中,应该用 'django.contrib.admin.apps.SimpleAdminConfig'代替'django.contrib.admin' 。

Changed in Django 1.7:
在以前的版本中,admin需要被指示寻找 admin.py 文件通过 autodiscover(). 在Django 1.7, auto-discovery默认可用的,必须明确的使它失效当不需要时.

2.3 ModelAdmin options

ModelAdmin是非常灵活的. 它有几个选项来处理自定义接口. 所有的选项都在 ModelAdmin 子类中定义:

from django.contrib import admin

class AuthorAdmin(admin.ModelAdmin):
    date_hierarchy = 'pub_date'

ModelAdmin.actions
actions 的列表 ,他们使列表页的改变成为可能详细信息请查看Admin actions

ModelAdmin.actions_on_top

ModelAdmin.actions_on_bottom
以上方法控制 actions bar 出现在页面的位置默认admin的更改列表显示行为在页面的顶部 (actions_on_top = True; actions_on_bottom = False).

ModelAdmin.actions_selection_counter

控制选择计数器是否紧挨着下拉菜单action默认的admin 更改列表将会显示它 (actions_selection_counter = True).

ModelAdmin.date_hierarchy
把 date_hierarchy 设置为在你的model 中的DateField或DateTimeField的字段名,然后更改列表将包含一个依据这个字段基于日期的下拉导航。

例如:

date_hierarchy = 'pub_date'

这将根据现有数据智能地填充自己,例如,如果所有的数据都是一个月里的, 它将只显示天级别的数据.

Note

date_hierarchy 在内部使用QuerySet.datetimes(). 当时区支持启用时,请参考它的一些文档说明。(USE_TZ = True).

ModelAdmin.exclude
如果设置了这个属性,它表示应该从表单中去掉的字段列表。

例如, 让我们来考虑下面的model:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    title = models.CharField(max_length=3)
    birth_date = models.DateField(blank=True, null=True)

如果你希望Author 模块的表单只包含 name 和title 字段, 你应该 像这样具体说明fields 或 exclude:

from django.contrib import admin

class AuthorAdmin(admin.ModelAdmin):
    fields = ('name', 'title')

class AuthorAdmin(admin.ModelAdmin):
    exclude = ('birth_date',)

由于Author模块只有三个字段, name, title, 和 birth_date,上面声明的表单结果将明确的包含相同的字段.

ModelAdmin.fields
如果需要实现字段的布局中的“添加” 和 “更改”,“更改”网页形式的简单改变像只显示可用字段的一个子集,你可以使用 fields选项修改他们的顺序或者行内分组(需要复杂布局的请参阅fieldsets 选项将在下一段讲到). 例如,可以定义一个简单的管理表单的版本使用django.contrib.flatpages.models.FlatPage 模块像下面这样:

class FlatPageAdmin(admin.ModelAdmin):
    fields = ('url', 'title', 'content')

Note

这个 fields 选项不应该与 fieldsets 选项中的 fields 字典关键字含糊不清, 就像下一段要讲的。

如果fields和fieldsets 选项都不存在, Django将会默认显示每一个不是 AutoField 并且 editable=True的字段, 在单一的字段集,和在模块中定义的字段有相同的顺序

ModelAdmin.fieldsets
设置fieldsets 控制管理“添加”和 “更改” 页面的布局.

fieldsets 是一个以二元元组为元素的列表, 每一个二元元组代表一个在管理表单

二元元组的格式是 (name, field_options), 其中 name 是一个字符串相当于 fieldset的标题, field_options 是一个关于 fieldset的字典信息,一个字段列表包含在里面。

一个完整的例子, 来自于django.contrib.flatpages.models.FlatPage 模块:

from django.contrib import admin

class FlatPageAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('url', 'title', 'content', 'sites')
        }),
        ('Advanced options', {
            'classes': ('collapse',),
            'fields': ('enable_comments', 'registration_required', 'template_name')
        }),
    )

在管理界面的结果看起来像这样:

管理界面

如果fields和fieldsets 选项都不存在, Django将会默认显示每一个不是 AutoField 并且 editable=True的字段, 在单一的字段集,和在模块中定义的字段有相同的顺序。

field_options 字典有以下关键字:

  • fields
    字段名元组将显示在该fieldset. 此键必选.

例如:

{
'fields': ('first_name', 'last_name', 'address', 'city', 'state'),
}

就像fields 选项, 显示多个字段在同一行, 包裹这些字段在一个元组. 在这个例子中, first_name 和 last_name 字段将显示在同一行:

{
'fields': (('first_name', 'last_name'), 'address', 'city', 'state'),
}
  • classes
    一个列表包含额外的CSS classes 应用到 fieldset.

例如:

{
'classes': ('wide', 'extrapretty'),
}

通过默认的管理站点样式表定义的两个有用的classes 是 collapse 和 wide. Fieldsets 使用 collapse 样式将会在初始化时展开并且替换掉一个 “click to expand” 链接. Fieldsets 使用 wide 样式将会有额外的水平空格.

  • description

一个可选择额外文本的字符串显示在每一个fieldset的顶部,在fieldset头部的底下. 字符串没有被TabularInline 渲染由于它的布局.

记住这个值不是 HTML-escaped 当它显示在管理接口中时. 这可以包含HTML如果你非常渴望. 另外,你可以使用纯文本和 django.utils.html.escape() 避免任何HTML特殊字符。

ModelAdmin.filter_horizontal
默认的, ManyToManyField 会在管理站点上显示一个(多选框).但是,当选择多个时多选框非常难用. 添加一个 ManyToManyField到该列表将使用一个漂亮的低调的JavaScript中的“过滤器”界面,允许搜索选项。选和不选选项框并排出现。参考filter_vertical 使用垂直界面。

ModelAdmin.filter_vertical
Same as filter_horizontal, but uses a vertical display of the filter interface with the box of unselected options appearing above the box of selected options.

ModelAdmin.form
默认情况下, ModelForm 是根据你的模型(model)动态创建的. 它被用来创建一个用于当前修改和添加页面的表单。你可以很容易的提供自己的 ModelForm,重写表单默认的添加/修改动作。 UPDATE django_182_sentences SET trans_text=; UPDATE django_182_sentences SET trans_text=Alternatively, you can customize the default form rather than specifying an entirely new one by using the ModelAdmin.get_form() method.

例子见 Adding custom validation to the admin部分。

提示

如果你在ModelForm中定义 Meta.model属性,那么也必须定义 Meta.fields或Meta.exclude属性。然而,当admin本身定义了fields,则Meta.fields属性将被忽略。

如果 ModelForm 仅仅只是给 admin 使用,那么最简单的解决方法就是忽略 Meta.model 属性,因为 ModelAdmin 将自动选择应该使用的模式。或者,你也可以设置在 Meta 类中的 fields = [] 来满足 ModelForm 的合法性。

提示

如果 ModelForm 和 ModelAdmin 同时定义了一个 exclude 选项,那么 ModelAdmin 具有更高的优先级:

from django import forms
from django.contrib import admin
from myapp.models import Person

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person
        exclude = ['name']

class PersonAdmin(admin.ModelAdmin):
    exclude = ['age']
    form = PersonForm

在上例中, “age” 字段将被排除而 “name” 字段将被包含在最终产生的表单中。

更多选项说明请参考网页:http://python.usyiyi.cn/django/ref/contrib/admin/index.html

推荐阅读更多精彩内容