内容发布(后台管理)
- 站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分
- “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力的工作。
- 因此, Django 会根据定义的模型类完全自动地生成管理模块
Django 框架中有一个非常强大的应用功能: 自动管理界面。 常被Web平台管理者使用,去管理整个Web平台。
默认情况下,在 settings.py
配置文件中 INSTALLED_APPS
包含以下应用程序,为了后续的开发,默认这些应用程序都是包含在里面的。
应用程序 | 功能 |
---|---|
django.contrib.admin | 管理网站 |
django.contrib.auth | 认证管理 |
django.contrib.contenttypes | 内容类型的框架 |
django.contrib.sessions | 会话框架 |
django.contrib.messages | 消息框架 |
django.contrib.staticfiles | 管理静态文件的框架 |
(1). 管理界面本地化
编辑 settings.py
文件,设置编码、时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
(2). 自定义模型加入后台管理
打开 bookApp/admin.py
文件,注册模型
from models import “自定义model”
admin.site.register(“自定义model”)
from django.contrib import admin
from models import Book,Hero
admin.site.register(Book)
admin.site.register(Hero)
问题:后台管理时, Book管理显示的是英文, 如何变成中文?
# bookApp/models.py
class Book(models.Model):
# ........此处省略
# 字符串的友好展示, 在交互式环境测试的时候生效
def __repr__(self):
return '<Book: %s>' % (self.title)
# 字符串友好展示,在后台管理的时候生效
def __str__(self):
return self.title
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
## 对Book数据表重命名为books
db_table = "books"
# 单数时显示的名称
+ verbose_name = '图书信息'
# 复数时显示的名称
+ verbose_name_plural = '图书信息'
(3) 自定义管理页bookApp/admin.py
Django 提供了 admin.ModelAdmin 类
通过定义 ModelAdmin
的子类,来定义模型在 Admin 界面的显示方式
from django.contrib import admin
from .models import Book, Hero
##关联对象
class HeroInline(admin.StackedInline):
model = Hero
extra = 2
# 书籍自定义管理页面
class BookAdmin(admin.ModelAdmin):
# list_display:显示字段,可以点击列头进行排序
list_display = ['id', 'title', 'pub_date']
# list_filter:过滤字段,过滤框会出现在右侧
list_filter = ['title', 'pub_date']
# search_fields:搜索字段,搜索框会出现在上侧
search_fields = ['title']
# list_per_page:分页,分页框会出现在下侧
list_per_page = 3
inlines = [HeroInline]
# 人物自定义管理页面
class HeroAdmin(admin.ModelAdmin):
# 后台管理查询需要的设置信息
# list_display:显示字段,可以点击列头进行排序
list_display = ['id', 'name', 'sex', 'content', 'book']
# list_filter:过滤字段,过滤框会出现在右侧
list_filter = ['book']
# search_fields:搜索字段,搜索框会出现在上侧
search_fields = ['name']
# list_per_page:分页,分页框会出现在下侧
list_per_page = 3
# 属性的先后顺序
# fields = ['book', 'name', 'content', 'gender']
# 属性分组
fieldsets = [('基础信息', {'fields': ['book', 'name']}),
('详细信息', {'fields': ['content','gender']}), ]
# 后台管理的配置文件
# Register your models here.
admin.site.register(Book, BookAdmin)
admin.site.register(Hero, HeroAdmin)
列表页属性
- list_display:显示字段,可以点击列头进行排序
list_display = [‘id’, ‘name’, ‘sex’, ‘content’, ‘book’] - list_filter:过滤字段,过滤框会出现在右侧
list_filter = [‘book’] - search_fields:搜索字段,搜索框会出现在上侧
search_fields = [‘name’] - list_per_page:分页,分页框会出现在下侧
list_per_page = 3
修改页属性
- 属性的先后顺序
fields = [‘book’, ‘name’, ‘content’, ‘gender’] - 属性分组
fieldsets = [(‘基础信息’, {‘fields’: [‘book’, ‘name’]}), (‘详细信息’, {‘fields’: [‘content’,‘gender’]}), ] - 注意: fields和fieldsets 只能设置一个.
关联对象
对于 Hero 模型类,关联注册
admin.StackedInline : 内嵌关联注册类
admin.TabularInline : 表格关联注册类
+class HeroInline(admin.StackedInline):
+ model = Hero
+ extra = 2
class BookAdmin(admin.ModelAdmin):
# ....此处省略代码
+ inlines = [HeroInline]
布尔值的显示
bookApp/models.py
发布性别的显示不是一个直观的结果,可以使用方法进行封装
class Hero(models.Model):
# .......此处省略部分重复代码
+ def sex(self):
+ if self.gender:
+ return "男"
+ else:
+ return "女"
admin.py
注册中使用 sex 代替 gender
class HeroAdmin(admin.ModelAdmin):
+ list_display = ['id', 'name', 'sex', 'content']
# .......此处省略部分重复代码