Django后台管理

基本配置

默认登录地址:http://127.0.0.1:8000/admin

创建后台管理员:

  python3  ./manage.py  createsuperuser    # 回车后输入以下内容

  Username:输入用户名

  Email Address:电子邮箱

  Password:密码
  Password(again):重复密码

基本管理

1、在应用中的admin.py中注册要管理的实体类(models.py中的类)

from django.contrib import admin
from .models import * # 注册CartInfo和Order两个实体类
admin.site.register(CartInfo)
admin.site.register(Order)

2、修改models.py,来改变后台内容的显示

  1). models.py中为各个类(实体类)追加一个方法。

def __str__(self):
return self.属性名

  2). 通过Models类的内部类Meta定义每个类的展现形式

class Author(models.Model):
  ... ...# 定义对象在后台的展现形式
def __str__(self):
return self.names # 声明内部类,定义当前类在管理页面中的展现形式
class Meta:
# 1.修改当前表名为author(需要同步到数据库)
db_table = 'author' # 下面两个只与后台有关系
# 2.修改实体类在后台管理页中的名称(单数)
verbose_name = '作者'
# 3.修改实体类在后台管理页中的名称(复数)
verbose_name_plural = verbose_name # 4.先按照年龄降序排序,再按照ID升序排序
ordering = ['-age', 'id']

高级管理

1、在admin.py中创建高级管理类并注册

# 定义Author高级管理类
# 类名:实体类名+Admin,必须继承admin.ModelAdmin
class AuthorAdmin(admin.ModelAdmin):
pass # 注册高级管理类
admin.site.register(Author, AuthorAdmin)

2、定制高级管理信息

# 定义Author高级管理类
class AuthorAdmin(admin.ModelAdmin):
# list_display:指定在列表页中能够显示的字段
# 取值:由属性名称组成的元组或列表
list_display = ['names', 'age', 'email'] # list_display_links:定义列表页中能链接到详情页的字段
# 取值:由属性名称组成的元组或列表(必须存在与list_display中)
list_display_links = ['names', 'email'] # list_editable:指定在列表页中允许被编辑的字段
# 取值:由属性名称组成的元组或列表
# 不能出现在list_display_links, 但是必须在list_display中
list_editable = ['age'] # search_fields:添加允许被搜索的字段
# 取值:由属性名称组成的元组或列表
search_fields = ['names', 'email'] # list_filter:在列表的右侧增加过滤器,实现快速筛选
list_filter = ['names', 'email'] # fields:指定详情页显示的字段以及排列的顺序
# 取值:由属性名称组成的元组或列表
fields = ['email', 'names', 'age', 'isActive'] # date_hierarchy:在列表页的顶端增加一个时间选择器
# 取值必须是DateField或DateTimeField的值
date_hierarchy = 'publicate' # fieldsets:在详情页中,对字段进行分组显示(不能同时与fields存在)
fieldsets = [
# 分组1
(
'基本信息', {
'fields': ('names', 'email')
}
),
# 分组2
(
'可选信息', {
'fields': ('age', 'isActive'),
'classes': ('collapse',),
}
)
]

关系映射

一对一映射

  一对一表示,A表中的一条记录只能与B表中的一条记录相关联。

  数据库中实现方式:

    A表:设置主键  

    B表:增加一列(字段),并引用自A表的主键,并且得增加唯一约束

  1、在Django中的实现方式:

    在要相关联的两个实体类中的任意一个中增加:

    属性(字段)名 =  models.OneToOneField(要关联的实体类名)

  2、关联查询

# 在Wife类中新增一个字段一对一关联Author类
class Wife(models.Model):
...
author=models.OneToOneField(Author)
# 正向查询:通过wife 找 author
# 1.获取 id 为1 的 Wife的信息
wife = Wife.objects.get(id=1)
# 2.通过 Wife 的关联属性 author 来找Author
author = wife.author # 反向查询:通过author 找 wife
# 1.获取 id 为14 的 Author的信息
author = Author.objects.get(id=14)
# 2.通过 author 的关联属性 wife 来找wife
# wife是Django通过OneToOneField在Author(被关联表)中默认增加的一个隐式属性
wife = author.wife

一对多映射

  一对多表示,A表中的一条记录能与B表中的多条记录相关联。反之,B表中的一条记录只能与B表中的一条记录相关联。

  数据库中实现方式:

    通过外键来实现一对多,在‘多’表中增加外键对‘一’表的主键进行引用

  1、在Django中的实现:

    在“多”的实体类中增加:

    属性(字段)名 = models.ForeignKey("一"的实体类名)

  2、关联查询

# Book(多) 和 Publisher(一)
class Book(models.Model):
... ...
publisher=models.ForeignKey(Publisher)
# 正向查询 - 通过Book查询Publisher
# 查询id为1的书籍的信息
book = Book.objects.get(id=1)
# 查询关联的publisher
publisher = book.publisher # 反向查询 - 通过Publisher查询Book
# Django会在 “一” 的实体中增加关联对象_set 属性,用于查询“多”的数据
# 结合 Publisher 和 Book 之间关系 :在 Publisher 中 增加了一个 book_set 属性
publisher=Publisher.objects.get(id=1)
books = publisher.book_set.all()

多对多关联

  多对多表示,A表中的一条记录能与B表中的多条记录相关联。反之,B表中的一条记录同样能与B表中的多条记录相关联。

  在数据库中的实现方式:

    必选创建第三张表,关联两张多对多的数据表

  1、在Django中实现方式:

    在任意一个要实现多对多关联的实体类中增加:

    属性(字段)名 = models.ManyToManyField(关联的实体类名)

  2、关联查询

# 实体类Author 与 Book多对多关联
class Author(models.Model):
... ...
book = models.ManyToManyField(Book)
# 正向查询-通过Author查询所有的Book
author = Author.objects.get(id=1)
# 通过 关联属性.all() 查询所有对应数据
books = author.book.all() # 反向查询-通过Book查询所有的Author
# Django中 会在Book(被关联) 实体中增加一个隐式属性author_set
book = Book.objects.get(id=1)
authors = book.author_set.all()

对于关联映射的总结:

  三种关联关系的查询中,都存在正向和反向两种查询方式

  正向查询都是直接用增加的关联属性进行查询就可以

  反向查询在Django中都会增加一个隐式属性,分别是:

    一对一:关联的实体类名(小写)

    一对多:在“一”的实体增加关联属性“_set”属性,用于查询"多"的数据

    多对多:与一对多类似。

未完待续......

最新文章

  1. web前端面试总结
  2. Elasticsearch Span Query跨度查询
  3. ---解决git pull 后出现冲突的解决方法
  4. php多版本管理phpenv
  5. iOS 中的字体预览
  6. select、poll、epoll之间的区别
  7. P141 实战练习——字符串(修改后)
  8. 获得当前时间的PRO
  9. KindEditor设置为过滤模式,但在代码模式下提交表单时不过虑HTML标签的解决方法
  10. important的妙用
  11. (十一)if...else&for循环&while循环
  12. 记一次Debian下PHP环境的搭建(nginx+mariadb+PHP)!
  13. voa 2015 / 4 / 13
  14. 错误:One or more post-processing actions failed. Consult the OPP service log for details
  15. Vue工具
  16. 烽火R2600交换机配置脚本
  17. meterpreter 渗透用法
  18. oc语言的Foundation框架(学习笔记1)
  19. day22 面向对象基础
  20. Unity3D Shader描边效果

热门文章

  1. jenkins 集成redmine
  2. Linux批量杀死进程
  3. 【CF671E】Organizing a Race 单调栈+线段树
  4. Edge Animate使用SPRITESHEET创建动画(三)
  5. linux上jar包的运行
  6. 【微信小程序】---授权登陆---【巷子】
  7. vue报错 Module not found: Error: Cannot resolve 'file' or 'directory'
  8. 持续集成之jenkins
  9. Python之logging日志模块
  10. 网络层 运输层 NAT路由器 NATP路由器 一根光纤 多个固定ip