欢迎来到Louis的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

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

 

posted on 2019-01-15 14:22  Louiszj  阅读(171)  评论(0)    收藏  举报

导航