1. 改变django默认语言的方法?
仅需添加’django.middleware.locale.LocaleMiddlewar’到 MIDDLEWARE_CLASSES设置中,并确保它在’django.contrib.sessions.middleware.SessionMiddleware’* 之后* 。
2. 怎样将已有models加入到admin管理中?
本问题用实例演示,假如有个app叫做books,该app包里包含3个模块Publisher、Author和Book,以下是将该三个模块添加到admin管理中的步骤:
在 books
目录下(
mysite/books
),创建一个文件:
admin.py
在admin.py中输入以下代码
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
#以下3句,实现将模块添加到后台管理
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)
3) 重启服务器,刷新后台界面(比如http://127.0.0.1:8000/admin)发现添加成功
3. 为什么用admin.site.register(x)注册了x模块,后台却无法显示?
admin后台管理模块,第一步是执行autodiscover函数,该函数是根据settings.INSTALLED_APPS来逐个处理每个模块的,注册了模块却无法生效,肯定是因为没有将模块添加到配置文件的INSTALLED_APPS中。
以下是autodiscover关于注册模块的部分代码
1
2
3
4
5
6
7
8
9
10
|
for
app
in
settings
.
INSTALLED_APPS
:
mod
=
import_module
(
app
)
# Attempt to import the app's admin module.
try
:
before_import_registry
=
copy
.
copy
(
site
.
_registry
)
import_module
(
'%s.admin'
%
app
)
|
4. 为什么我没有写admin.py,后台却默认显示了Auth的Groups和Users两个模块?
这是因为:
1) 我们在INSTALLED_APPS增加了’django.contrib.auth’选项,admin.autodiscover会去该包查找admin.py
2) 在django的源码包django.contrib.auth里面,我们找到了admin.py,并且里面刚好注册了Groups和Users两个模块
看代码:
1
2
3
|
admin
.
site
.
register
(
Group
,
GroupAdmin
)
admin
.
site
.
register
(
User
,
UserAdmin
)
|
又比如后台默认页显示了sites模块,找到contrib.sites,也可以发现admin.py,以下是它的内容:
1
2
3
4
5
6
7
8
9
10
11
|
from
django
.
contrib
import
admin
from
django
.
contrib
.
sites
.
models
import
Site
class
SiteAdmin
(
admin
.
ModelAdmin
)
:
list_display
=
(
'domain'
,
'name'
)
search_fields
=
(
'domain'
,
'name'
)
admin
.
site
.
register
(
Site
,
SiteAdmin
)
|
其实不难发现,contrib里面的包,大部分都自含admin.py文件,这也就是说,只要在INSTALLED_APPS中添加了该目录中的某个包,后台就能够对它进行管理了。
5. 怎样让某个表单字段是可选填写的?
想要哪个字段是可选填写的,就在该Model的该字段的选项中(括号内)加上blank=True即可,如下所示:
1
2
3
4
5
6
7
|
class
Author
(
models
.
Model
)
:
first_name
=
models
.
CharField
(
max_length
=
30
)
last_name
=
models
.
CharField
(
max_length
=
40
)
email
=
models
.
EmailField
(
blank
=
True
)
|
所有的字段,默认blank=false,所以都是必填不能为空的
6. 设置日期型和数字型字段可选的方法?
Django生成CREATE TABLE语句自动为每个字段显式加上NOT NULL,在管理工具中,如果你留空一个字符型字段,它会为此插入一个空字符串(而* 不是*NULL),但是,其它数据类型有例外:日期型、时间型和数字型字段不接受空字符串。
如果你想允许一个日期型(DateField、TimeField、DateTimeField)或数字型(IntegerField、DecimalField、FloatField)字段为空,你需要使用null=True * 和* blank=True。
1
2
3
4
5
6
7
8
9
|
class
Book
(
models
.
Model
)
:
title
=
models
.
CharField
(
max_length
=
100
)
authors
=
models
.
ManyToManyField
(
Author
)
publisher
=
models
.
ForeignKey
(
Publisher
)
publication_date
=
models
.
DateField
(
blank
=
True
,
null
=
True
)
|
因为null=True改变了数据的语义,即改变了CREATE TABLE语句,把publication_date字段上的NOT NULL删除了。 要完成这些改动,我们还需要更新数据库。
7. 怎样更改表单中字段的说明文字?
在编辑页面中,每个字段的标签都是从模块的字段名称生成的,然而,字段名称并不总是贴切的。有些情况下,你可能想自定义一个标签。 你只需在模块中指定verbose_name。
1
2
3
4
5
6
7
|
class
Author
(
models
.
Model
)
:
first_name
=
models
.
CharField
(
max_length
=
30
)
last_name
=
models
.
CharField
(
max_length
=
40
)
email
=
models
.
EmailField
(
blank
=
True
,
verbose_name
=
'e-mail'
)
|
8. ModelAdmin类是干什么的?
像blank=True、null=True和verbose_name修改其实是模块级别,而不是管理级别的。 也就是说,这些修改实质上是构成模块的一部分,并且正好被管理工具使用,而不是专门针对管理工具的。
Django还提供了大量选项让你针对特别的模块自定义管理工具。 这些选项都在ModelAdmin classes里面,这些类包含了管理工具中针对特别模块的配置。
9. 怎样自定义后台管理的列表页面?
看代码和解释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#怎样自定义列表页面?
class
AuthorAdmin
(
admin
.
ModelAdmin
)
:
#列表页,列表顶部显示的字段名称
list_display
=
(
'first_name'
,
'last_name'
,
'email'
)
#列表页出现搜索框,参数是搜索的域
search_fields
=
(
'first_name'
,
'last_name'
)
#右侧会出现过滤器,根据字段类型,过滤器显示过滤选项
list_filter
=
(
'publication_date'
,
)
#页面中的列表顶端会有一个逐层深入的导航条,逐步迭代选项
date_hierarchy
=
'publication_date'
#自然是排序所用了,减号代表降序排列
ordering
=
(
'-publication_date'
,
)
#将Author模块和管理类绑定在一起,注册到后台管理
admin
.
site
.
register
(
Author
,
AuthorAdmin
)
|
10. 怎样自定义编辑后台管理的表单页面?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#以下显示怎样自定义表单编辑页面的显示,注意它和列表页是在一个Admin类内部的
class
BookAdmin
(
admin
.
ModelAdmin
)
:
#
# 这里可以写一些列表页面自定义选项
#
# 以下是表单编辑页面自定义选项
# 表单编辑页面,字段显示的顺序,如果没有某个选项,就不会显示
fields
=
(
'title'
,
'authors'
,
'publisher'
,
'publication_date'
)
# 有了该设定,表单中该选项,变成了一个用JS动态选择的选择框,就是左右两列\
# 左边选择,右边显示被选中的内容,
# 强烈建议针对那些拥有十个以上选项的"多对多字段"使用filter_horizontal
filter_horizontal
=
(
'authors'
,
)
# 用于外键,并且外键超级多的时候,是一个包含外键字段名称的元组,
# 它包含的字段将被展现成`` 文本框`` ,而不再是`` 下拉框``
raw_id_fields
=
(
'publisher'
,
)
|