Django - admin组件,使用admin管理模型类,admin配置类参数,admin组件源码解析
一.使用admin管理模型类
我们使用pycharm安装django项目时,会默认给我们安装好admin组件,他是django内置的组件,我们可以用他来进行模型类管理。

创建模型类
models.py
from django.db import models # Create your models here. from django.db import models # Create your models here. class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() # 与AuthorDetail建立一对一的关系 authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE) def __str__(self): return self.name class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday = models.DateField() telephone = models.BigIntegerField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) # 与Publish建立一对多的关系,外键字段建立在多的一方 publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE) # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表 authors = models.ManyToManyField(to='Author', ) def __str__(self): return self.title
在admin.py中注册模型类
admin.py
from django.contrib import admin from adminDemo.models import Publish, Book, Author, AuthorDetail # Register your models here admin.site.register(Book) admin.site.register(Publish) admin.site.register(AuthorDetail) admin.site.register(Author)
浏览器输入http://127.0.0.1:8000/admin,会跳转到下面页面

使用python manage.py createsuperuser创建超级用户,用于登录admin
用帐户登录后,可以看到上面我们注册的几个模型类都在这里了。

二.admin增删改查的url设置,及配置类的基本使用
http://127.0.0.1:8000/admin/adminDemo/book/ # 查 http://127.0.0.1:8000/admin/adminDemo/book/4/change/ # 编辑 http://127.0.0.1:8000/admin/adminDemo/book/add/ #增加 http://127.0.0.1:8000/admin/adminDemo/book/4/delete/ # 删除
默认如果注册后,不进行任何配置,我们看到的页面是这样的

而如果需要显示数据的更多信息,及其他功能就需要进行配置了。
我们再看看进行配置过后的页面

会发现多了过滤和搜索,显示的字段也多了,还加了自定义的action批量操作功能
admin.py
from django.contrib import admin from adminDemo.models import Publish, Book, Author, AuthorDetail # Register your models here. # 给模型类使用 class BookConfig(admin.ModelAdmin): # list_display不能放ManyToMany的字段, must not be a ManyToManyField. list_display = ['nid', 'title', 'price', 'publishDate', 'publish'] # 设置当前记录的编辑可点击字段 list_display_links = ['title'] # 设置过滤字段 (分类查询) list_filter = ['publish', 'authors'] # 设置搜索字段,字段之间或关系,(精确查询) search_fields = ['title', 'price'] # 批量操作 def patch_init(self, request, queryset): queryset.update(price=0) # 描述 patch_init.short_description = '价格初始化' actions = [patch_init] # 使用配置类 admin.site.register(Book, BookConfig) admin.site.register(Publish) admin.site.register(AuthorDetail) admin.site.register(Author)
三.admin组件源码简单解析
1.启动
django启动后,会加载settings中的INSTALL_APP
加载admin组件

2.注册(单例模式的应用)
源码:
# admin---sites.py----> class AdminSite(object): def __init__(self): self._registry = {} def register(self,model,admin_class=None): # 设置配置类 admin_class = admin_class or ModelAdmin # 注册 self._registry[model] = admin_class(model, self) #单例模式 site = AdminSite()
app中的admin.py
# site为单例对象 admin.site.register(Author) class BookConfig(admin.ModelAdmin): pass admin.site.register(Book,BookConfig)
3.设计url
浙公网安备 33010602011771号