Django关于站点管理Admin Site的常见问题解决方法

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关于注册模块的部分代码

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两个模块

看代码:

admin.site.register(Group, GroupAdmin)

admin.site.register(User, UserAdmin)

 

 

又比如后台默认页显示了sites模块,找到contrib.sites,也可以发现admin.py,以下是它的内容:

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即可,如下所示:

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。

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。

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. 怎样自定义后台管理的列表页面?

看代码和解释:

#怎样自定义列表页面?

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. 怎样自定义编辑后台管理的表单页面?

#以下显示怎样自定义表单编辑页面的显示,注意它和列表页是在一个Admin类内部的

class BookAdmin(admin.ModelAdmin):

    #
    # 这里可以写一些列表页面自定义选项
    #
    # 以下是表单编辑页面自定义选项
    # 表单编辑页面,字段显示的顺序,如果没有某个选项,就不会显示
    fields = ('title', 'authors', 'publisher', 'publication_date')
    # 有了该设定,表单中该选项,变成了一个用JS动态选择的选择框,就是左右两列\
    # 左边选择,右边显示被选中的内容,
    # 强烈建议针对那些拥有十个以上选项的"多对多字段"使用filter_horizontal
    filter_horizontal = ('authors',)
    # 用于外键,并且外键超级多的时候,是一个包含外键字段名称的元组,
    # 它包含的字段将被展现成` 文本框 ,而不再是 下拉框`
    raw_id_fields = ('publisher',)

 

相关推荐

1 thought on “Django关于站点管理Admin Site的常见问题解决方法”

Leave a Comment