django的自动管理界面:
Django自动管理工具(django.contrib.admin)是django.contrib的一部分。Django自带很多优秀的附加组件,它们都存在于django.contrib包里。
自动管理界面的访问:
- 确保你的settings.py的INSTALLED_APPS配置中包含:‘django.contrib.admin’,‘django.contrib.auth’,‘django.contrib.contenttypes’和’django.contrib.sessions’。
MIDDLEWARE_CLASSES 包含’django.middleware.common.CommonMiddleware’,‘django.contrib.sessions.middleware.SessionMiddleware’和’django.contrib.auth.middleware.AuthenticationMiddleware’ 。 - 生成管理界面使用的额外数据库表
- 将admin访问配置在URLconf(记住,在urls.py中).
默认情况下,命令django-admin.py startproject生成的文件urls.py是将Django admin的路径注释掉的,你所要做的就是取消urlpatterns变量下面关于admin路径的注释 - 运行开发服务器:
python ../manage.py runserver
- 在浏览器中访问:http://127.0.0.1:8000/admin/
- 使用你原来设置的超级用户的用户名和密码进行登陆
- 更改页面语言:
在settings.py设置LANGUAGE_CODE = ‘zh-hans’;时区TIME_ZONE = ‘Asia/Shanghai’ 。
将Models加入到Admin管理中:
在生成的books目录下面,更改admin.py文件为:
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)
然后刷新http://127.0.0.1:8000/admin/
,会看到一个Books区域,其中包含Authors、Books和Publishers。打开Publishers也可以看到我们之前在数据库中增加的条目
Admin是如何工作的?
属性层面的更改:
- 设置字段可选:
- 字符型字段:
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True)//表示该字段可选
- 日期和数值型字段:
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE,)
publication_date = models.DateField(blank=True, null=True)//说起来有点复杂,如果想让日期字段或数值字段接受空值,则要同时添加blank=True, null=True。字符字段则不用。
//注意:如果此时的null=true是之后加的,务必使用python ../manage.py makemigrations 和python ../manage.py migrate来进行更新数据库。
- 自定义字段标签:
编辑界面一般会对数据库中的属性标签进行更改:用空格替换下划线;首字母大写。但你也可以在模块中指定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' )
模板层面的更改:
- AuthorAdmin类的使用:
为Author模块定义一个AuthorAdmin类,来自定义管理Author列表。打开admin.py文件:
from django.contrib import admin
from books.models import Publisher, Author, Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')//添加的语句
admin.site.register(Publisher)
admin.site.register(Author,AuthorAdmin)//这里不要漏加了
admin.site.register(Book
更新完毕可能需要重新启动服务器。
我们还可以给AuthorAdmin追加search_fields,来添加一个快速查询栏:
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
search_fields = ('first_name', 'last_name')
- BookAdmin类的使用:
- 过滤器的使用
照猫画虎: list_filter用来创建过滤器,该过滤器位于列表页面的右边。
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email')
search_fields = ('first_name', 'last_name')
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)//逗号不能少啊啊啊啊啊啊啊啊啊,变量名别搞错啊啊啊这里是过滤器。
admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
还有一种过滤日期的方式,用date_hierarchy选项,表现在页面列表顶有一个逐层深入的导航条。注意此时数据里面存在date时才会显示。
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)//按publication date降序排列,注意页面上的Publication date列头现在有一个小箭头显示排序
- 模型内自定义字段顺序及隐藏:
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
fields = ('title', 'authors', 'publisher')//自定义表单,这里隐藏了publication_date,防止它被编辑
- 编辑菜单自定义多对多字段
books编辑页面"多对多字段"作者被展现成多选框,当有几百个作者的选项时,会很糟糕。而且,虽然下面有注释,但是选择多个作者很不方便。现在使用filter_horizontal改进,可以在多对多的选择上添加一个精巧的JS过滤器
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'publisher', 'publication_date')
list_filter = ('publication_date',)
date_hierarchy = 'publication_date'
ordering = ('-publication_date',)
filter_horizontal = ('authors',)// filter_vertical功能相同,只是控件垂直放置了而已。
- 编辑菜单自定义外键的修改
filter_horizontal和filter_vertical选项只能用在多对多字段 上, 而不能用于 ForeignKey字段。
解决这个问题的办法是使用raw_id_fields
选项。它是一个包含外键字段名称的元组,它包含的字段将被展现成文本框
,而不再是下拉框
。
点"放大镜"图标就可以打开一个新的页面来显示外键。
总结:
Django的管理界面对非技术用户要输入他们的数据时特别有用;事实上这个特性就是专门为这个 实现的