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 类,它包含了为这些特定??樽远ㄒ宓墓芾砉δ芎脱∠?/p>

  6. 实例化AdminSite 并且告诉它你的每一个??楹蚆odelAdmin 类.

  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,可以提供一个或多个??槔嗬醋⒉酠odelAdmin 并且一个选择性关键参数 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

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容