后台管理
一个网站分为前台(普通用户访问)和管理后台(由网站管理员访问)两部分
管理后台由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块,需要按照如下步骤操作
管理界面本地化
创建管理员
注册模型类
自定义管理页面
操作演示:
1)本地化 (语言和时区)
修改settings.py文件。
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 指定语言(注意不要写错,否则无法启动服务器)
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 指定时间
2)创建登录后台的管理员
python3 manage.py createsuperuser
需要指定: 用户名,邮箱,密码
3)注册模型类
在应用下的admin.py中注册模型类:告诉djang框架,根据注册的模型类来生成对应表管理页面:
# app01/admin.py:
from app01.models import Department, Employee
# 注册Model类
admin.site.register(Department)
admin.site.register(Employee)
4) 启动服务器:
python manage.py runserver
在浏览器上输入以下地址,进入管理后台,对数据库表数据进行管理:
http://127.0.0.1:8000/admin
5)自定义数据模型显示哪些字段信息
自定义模型管理类,作用:告诉django在生成的管理页面上显示哪些内容。
# app01/admin.py:
class DepartmentAdmin(admin.ModelAdmin):
# 指定后台网页要显示的字段
list_display = ["id", "name", "create_date"]
class EmployeeAdmin(admin.ModelAdmin):
# 指定后台网页要显示的字段
list_display = ["id", "name", "age", "sex", "comment"]
# 注册Model类
admin.site.register(Department, DepartmentAdmin)
admin.site.register(Employee, EmployeeAdmin)
Admin站点
内容发布的部分由网站的管理员负责查看、添加、修改、删除数据,开发这些重复的功能是一件单调乏味、缺乏创造力的工作,为此,Django能够根据定义的模型类自动地生成管理模块,在Django项目中默认启用Admin管理站点。
后台管理准备工作
1、数据库配置:
配置数据库
mysql中创建数据库:db_django05
在项目的__init__文件中import pymysql包
2、模型操作
(1)、创建Area区域模型类;
class Area(models.Model):
"""地区类"""
title = models.CharField(max_length=50)
# 外键: 自关联
parent = models.ForeignKey('self', null=True, blank=True)
(2)、生成迁移文件,再作迁移生成数据库表;
(3)插入测试数据: source area.sql (资料中提供)
3、admin后台管理操作
(1)创建后台管理器账号
python manage.py createsuperuser
按提示填写用户名、邮箱、密码,确认密码。
(2)注册模型类: 要在后台要能看到模型类表,需要在admin.py中注册模型类
from django.contrib import admin
from models import *
admin.site.register(Area)
(3)登录到后台: 通过http://127.0.0.1:8000/admin/访问服务器: 输入刚创建的用户名和密码,登录到后台管理界面,登录成功可以看到如下,可以对Area进行增加、修改、删除、查询的管理操作:
列表页选项
类ModelAdmin可以控制模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式。
在app01/admin.py中,注册模型类前定义管理类AreaAdmin
class AreaAdmin(admin.ModelAdmin):
pass
打开app01/admin.py文件,注册模型类代码如下
admin.site.register(AreaInfo, AreaAdmin)
接下来介绍如何控制列表页、增加修改页展示效果
1、每页显示多少条
打开booktest/admin.py文件,修改AreaAdmin类如下:
class AreaAdmin(admin.ModelAdmin):
list_per_page = 10 # 默认为100条
在浏览器中查看区域信息的列表页面,效果如下图:
设置操作选项的位置
app01/admin.py
class AreaAdmin(admin.ModelAdmin):
...
# 显示顶部的选项
actions_on_top = True
# 显示底部的选项
actions_on_bottom = True
在浏览器中刷新效果如下图:
列表中的列操作
定义列表中要显示哪些字段
# app01/admin.py
class AreaAdmin(ModelAdmin):
# 定义列表中要显示哪些字段
list_display = ['id', 'title']
点击列头可以进行升序或降序排列
模型类中定义的方法也可以作为列显示(通过此方式可访问关联对象的属性)
# models.py
class Area(models.Model):
"""区域显示"""
...
def parent_area(self):
"""返回父级区域名"""
if self.parent is None:
return ''
return self.parent.title
注册列:
class AreaAdmin(ModelAdmin):
...
# 定义列表中要显示哪些字段(也可以指定方法名)
list_display = ['id', 'title', 'parent_area']
修改显示的列的名字
列标题默认为属性或方法的名称,可以通过属性设置。对于模型属性,通过verbose_name设置,对于方法,通过short_description设置,如下:
# models.py
class Area(models.Model):
"""区域显示"""
# 设置verbose_name属性
title = models.CharField(verbose_name='名称', max_length=30) # 区域名
def parent_area(self):
"""返回父级区域名"""
if self.parent is None:
return ''
return self.parent.title
# 指定方法列显示的名称
parent_area.short_description = '父级区域'
# 方法列默认不能排序,需要指定方法列按id进行排序
parent_area.admin_order_field = 'id'
右侧栏过滤器
使用list_filter指定过滤,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般用于有重复的字段。
# admin.py
class AreaAdmin(ModelAdmin):
...
# 右侧栏过滤器
list_filter = ['title']
刷新效果如下:
搜索框
使用search_fields属性, 对指定字段的值进行搜索,支持模糊查询
# admin.py
class AreaAdmin(ModelAdmin):
...
# 要搜索的列的值
search_fields = ['title']
刷新效果如下:
编辑页选项
1、显示字段顺序
# admin.py
class AreaAdmin(ModelAdmin):
...
# 表单中字段显示的顺序
fields = ['parent', 'title']
修改对象显示的字符串: 重写__str__方法
# models.py
class Area(models.Model):
"""区域显示"""
...
# 重写方法
def __str__(self):
return self.title
刷新效果如下:
字段分组显示
格式如下:
fieldsets=(
('组1标题',{'fields':('字段1','字段2')}),
('组2标题',{'fields':('字段3','字段4')}),
)
注意:fieldsets和fields,只能使用其中的一个
代码:
# admin.py
class AreaAdmin(ModelAdmin):
...
# 字段分组显示
fieldsets = (
('基本', {'fields': ('title',)}),
('高级', {'fields': ('parent',)}),
)
编辑关联对象
在一对多的关系中,可以在一端的编辑页面中编辑多端的对象,嵌入多端对象的方式包括表格、块两种
类型InlineModelAdmin:表示在模型的编辑页面嵌入关联模型的编辑
子类TabularInline:以表格的形式嵌入
子类StackedInline:以块的形式嵌入
在app01/admin.py文件中添加如下代码:
class AreaStackedInline(admin.StackedInline):
model = AreaInfo # 关联子对象(多类对象)
class AreaAdmin(admin.ModelAdmin):
...
inlines = [AreaStackedInline]
下面再来看下表格的效果:
class AreaTabularInline(TabularInline):
model = Area # 多类的名字
...
class AreaAdmin(admin.ModelAdmin):
...
inlines = [AreaTabularInline]
刷新效果如下:
修改预留新增选项
class AreaTabularInline(TabularInline):
...
extra = 2 # 额外预留新增选项默认为3个
重写后台管理模板
1、进入到django的admin应用的模板目录,如下:
/home/python/.virtualenvs/py_django/lib/python2.7/site-packages/django/contrib/admin/templates/admin
找到base-site.html文件,复制到当前项目的templates/admin目录下(admin目录需要自行创建出来)
修改base-site.html内容:
新增一行代码,如下图:
刷新结果:
choices选项和富文本编辑器
一、choices选项使用
创建测试模型类
# apps/user/models.py
class TestModel(models.Model):
"""测试"""
ORDER_STATUS_CHOICES = (
(1, "待支付"),
(2, "待发货"),
(3, "待收货"),
(4, "待评价"),
(5, "已完成"),
)
status = models.SmallIntegerField(default=1,
verbose_name='订单状态',
choices=ORDER_STATUS_CHOICES)
class Meta(object):
db_table = 'df_test'
# 指定模型在后台显示的名称
verbose_name = '测试模型'
# 去除后台显示的名称默认添加的 's'
verbose_name_plural = verbose_name
在后台注册
# apps/users/admin.py
from django.contrib import admin
from apps.users.models import TestModel
admin.site.register(TestModel)
创建django后台登录账号,并登录到后台
二、富文本编辑器使用
HTMLField富文本控件的显示效果:
使用方式:
1、安装依赖:
pip install django-tinymce==2.6.0
2、setting.py文件中配置
INSTALLED_APPS = (
...
'tinymce', # 使用应用
)
# 配置控件显示样式
TINYMCE_DEFAULT_CONFIG = {
'theme': 'advanced', # 丰富样式
'width': 600,
'height': 400,
}
项目/urls.py中配置url
import tinymce.urls
urlpatterns = [
...
# 包含tinymce urls配置文件
url(r'^tinymce/', include('tinymce.urls')),
]
在模型类中使用HTMLField
class TestModel(models.Model):
"""测试"""
# 富文本控件
desc = HTMLField(verbose_name='商品描述', null=True)
...
重新迁移数据库,登录到后台进行测试
三、修改 GoodsSPU 模型类的商品详情
1、把GoodsSPU模型类的 商品详情 字段类型 改为 HTMLField 类型
class GoodsSPU(BaseModel):
"""商品SPU表"""
desc = HTMLField(verbose_name="商品描述", default="", blank=True)
...
2、重新迁移数据库,生成表
3、注册: GoodsSPU 模型类,让它在后台显示,使用富文本录入 商品详情
# 注册模型类,让它在后台显示
from apps.goods.models import GoodsSPU
admin.site.register(GoodsSPU)