一般所有web应用都需要有一个后台,该后台一般由超级管理员使用,为什么要给超级管理员提供这样一个功能呢?这样才能随心所欲删帖啊!哈哈哈!
1. 本地化设置
为了进行Django后台的修改,方便起见,需要先将后台显示的语言改成中文,将时区改为上海时间,这可以通过修改settings.py
文件来实现。
# settings.py
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 使用中文
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 使用中国时间
2. 创建管理员
python manage.py createsuperuser
使用上述命令来创建超级管理员用户。
(virtualenv4_django) william@ubuntu:~/django_intro/test1$ python manage.py createsuperuser
用户名 (leave blank to use 'william'): admin
电子邮件地址: admin@python-guru.com
Password:
Password (again):
Superuser created successfully.
启动Django项目
python manage.py runserver
打开浏览器,在网址栏输入127.0.0.1:8000/admin
后回车
输入管理员用户的用户名和密码以登录:
3. 自定义管理页面
为了能在后台管理各个数据表,需要先在后台管理页面将数据表显示出来,然后根据需求,再修改用于管理各数据表的页面。
3.1 显示管理页面
显示管理界面是指,在Django的后台管理页面将各个数据表显示出来,可以让有权限的用户通过图形化的方式操作各个数据表。这可以通过在admin.py
中注册模型类来实现:
# admin.py
from django.contrib import admin
from booktest.models import BookInfo # 导入模型类
# Register your models here.
admin.site.register(BookInfo) # 注册模型类
注册完成后,刷新通过超级管理员登录的Django后台页面,如下图所示可将book_info
数据表显示在了后台。
成功显示后,存在的一个问题是,如果你点击book_info
数据表对应的后台界面按钮,会发现数据记录是一个对象名称。
实际上,由下列代码可知:上述显示的数据表中的记录就是对象的字符串表示形式。
>>> from booktest.models import BookInfo
>>> book = BookInfo.objects.get(book_title='天龙八部')
>>> str(book)
'BookInfo object (2)'
因此,为了使得数据表中的记录显示得更加友好,可以在models.py
文件中重写数据表BookInfo
类的__str__()
方法,使之返回可读性更高的信息,在这里返回的是图书的名称。
# models.py
from django.db import models
# Create your models here.
# 创建图书类
class BookInfo(models.Model):
"""图书模型类"""
# 图书名称,CharField说明是该类属性是一个字符串,max_length指定最大长度
book_title = models.CharField(max_length=20)
# 出版日期,DateField说明该类属性是一个日期
book_pub_date = models.DateField()
def __str__(self):
"""覆盖对BookInfo实例化对象使用str()的返回值"""
return self.book_title # 返回书名
在重写models.py
文件中BookInfo
类的__str__()
方法后,刷新页面,可见Django后台book_info
对应数据表的界面显示已经变化。
3.2 设置管理页面
进一步地,你可能会觉得在显示数据表book_info
的记录时,仅显示book_title
字段信息不足,你可能会希望像在数据库中一样,显示一条记录的所有字段,此时你可以通过在admin.py
中自定义模型管理类来实现该需求:
# admin.py
from django.contrib import admin
from booktest.models import BookInfo, HeroInfo
# 自定义模型管理类,实现自定义BookInfo的后台管理界面
class BookInfoAdmin(admin.ModelAdmin):
"""图书模型管理类"""
list_display = ['id', 'book_title', 'book_pub_date']
# Register your models here.
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo)
即:
- 首先,从当前应用
booktest
的models
包中导入book_info
数据表对应的模型类BookInfo
; - 然后,通过继承类
admin.ModelAdmin
来自定义模型管理类BookInfoAdmin
,并同时为该类定义一个为列表的类属性(名称必须为list_display
),且列表元素为希望展示展示的全部字段; - 最后,调用
admin.site
中的register
注册book_info
数据表对应的模型类和自定义模型管理类BookInfoAdmin
。
接下来,请移步【Django入门】——视图函数的使用学习Django中视图函数的使用。