1.Admin组件使用
Django内集成了web管理工具,Django在启动过程中会执行setting.py文件,初始化Django内置组件、注册APP、添加环境变量等
# Application definition INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app.apps.AppConfig',
]
示例:
激活管理工具,并将数据模型注册到admin便可以进行增删查改
1)激活(默认在生成项目时激活)
from django.contrib import admin
from django.urls import path urlpatterns = [
path('admin/', admin.site.urls),
]
2)注册
通过 python manage.py createsuperuser 创建超级用户,将准备好的数据模型注册到admin,启动服务之后通过http://127.0.0.1:8000/admin访问登录(本地管理测试)
from django.db import models # Create your models here.
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):
"""
用户信息表
"""
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11,
null=True,
unique=True) def __str__(self):
return self.username class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() def __str__(self):
return self.name class Publish(models.Model):
name = models.CharField(max_length=32)
email = models.EmailField() def __str__(self):
return self.name class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2) publisher = models.ForeignKey(to="Publish", on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author') def __str__(self):
return self.title
models数据模型
3)admin定制
在admin.py中注册models中相应的类,即可通过管理工具进行增删查改
# 方式一:
class User_admin(admin.ModelAdmin):
list_display = ("username",) # 第一个参数可传入列表,实现多个数据模型的注册
admin.site.register(models.UserInfo, User_admin) # 方式二:
@admin.register(models.UserInfo)
class User_admin(admin.ModelAdmin):
list_display = ("username",)
2.可在ModelAdmin中定制其它功能
1)list_diapaly,定制显示的列
class User_admin(admin.ModelAdmin):
list_display = ("username",) # 第一个参数可传入列表,实现多个数据模型的注册
admin.site.register(models.UserInfo, User_admin)
2)list_display_links,定制列可以跳转
class Publisher_admin(admin.ModelAdmin):
list_display = ("name", "email")
list_display_links = ["name", "email",] admin.site.register(models.Publish, Publisher_admin)
3)其它定制方法
list_filter 列表时,定制右侧快速筛选。
list_select_related 列表时,连表查询是否自动select_related
list_editable 列表时,可以编辑的列
search_fields 列表时,模糊搜索的功能
date_hierarchy 列表时,对Date和DateTime类型进行搜索
inlines 详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
action 列表时,定制action中的操作 定制HTML模板
add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None raw_id_fields 详细页面,针对FK和M2M字段变成以Input框形式
fields 详细页面时,显示字段的字段
exclude 详细页面时,排除的字段
readonly_fields 详细页面时,只读字段
fieldsets 详细页面时,使用fieldsets标签对数据进行分割显示
详细页面时,M2M显示时,数据移动选择(方向:上下和左右)
filter_vertical
filter_horizontal
ordering 列表时,数据排序规则
radio_fields 详细页面时,使用radio显示选项(FK默认使用select)
form = ModelForm 用于定制用户请求时候表单验证
empty_value_display = "列数据为空时,显示默认值"
3.Admin源码解析
1)单例模式
Singleton Pattern,是一种常用的软件设计模式,主要确保相应的类只有一个实例存在,例如一个连接数据类,只需生成一个实例,在存在多个连接的情况下无需再生成多个实例,从而节省内存资源
Python中实现单例的方式(详见面向对象章节):
- 通过导入模块的方式
- 使用__new__方法
- 使用装饰器(decorator)
- 使用元类(metaclass)
示例:
通过模块导入,Python模块就是天然的单例模式,在模块第一次导入的时候,会生成.pyc文件,再次导入时会直接执行.pyc文件,而不会再次执行模块中的代码,即只在首次导入执行模块内代码,因此可将相关的函数或数据定义在指定模块中并将其导入便可得到一个单例
# mysingleton.py
class My_Singleton(object):
def func(self):
pass my_singleton = My_Singleton()
将模块导入
from mysingleton import my_singleton my_singleton.func()
2)以将models数据模型中的类注册到Admin看执行流程
待续