zoukankan      html  css  js  c++  java
  • Django admin组件

    admin

       adminDjango自带的后台管理组件,你可以在admin中执行增删改查等操作。

       它以可视化的方式让你来操纵模型表,十分的便捷。

    基本使用

    数据准备

       如下,在app01中有一个这样的模型表:

    from django.db import models
    
    # Create your models here.
    
    
    class User(models.Model):
        user_id = models.AutoField(primary_key=True, verbose_name="用户编号")
        user_name = models.CharField(max_length=32, verbose_name="用户名")
        user_gender = models.BooleanField(
            choices=([0, "male"], [1, "female"]), verbose_name="用户性别")
        user_introduction = models.TextField(
            max_length=1024, null=True, blank=True, verbose_name="用户简介")
    
        def __str__(self):
            return self.user_name
    

      

    创建用户

       当运行了数据库迁徙命令后,需要创建一个可登录admin进行管理的超级账户。

    python manage.py createsuperuser
    

       它会提示你输入用户名,以及密码,密码不能少于八位。

       可以选填邮箱。

    注册admin

       管理员用户创建完成后,在app01应用下进行注册。

    from django.contrib import admin
    from .models import *
    
    admin.site.register(User)
    

       接下来打开admin,输入账户名与密码后,就可以看到这张表。

       image-20201023144617473

       接下来就可以对该表进行增删改查了。

       image-20201023144728667

    深度配置

    models参数

       在创建模型表时,可以对字段添加一些与admin相关的参数。

    参数描述
    verbose_name Admin中显示的字段名称
    blank Admin中进行添加或编辑时,该字段是否可以为空
    editable Admin中是否可编辑该字段
    help_text Admin中的帮助信息
    choices Admin中选择框显示的内容

       在这里的blankverbose_name以及choices都比较常用。

       除了在模型表的字段上进行配置外,也可以在该表下定制元信息。这其中有关于该表在Admin中的信息显示,如下所示:

     class User(models.Model):
    	字段 = 类型(条件)
    	字段 = 类型(条件)
        class Meta:
            verbose_name = "Admin中显示的表名"
    

    admin配置

       如果要对一个注册的表进行深度配置,可在admin.py中对它进行。

       常用的配置方式有两种,如下所示:

    from django.contrib import admin
    
    # 装饰器注册
    @admin.register(User)
    class UserConfig(admin.ModelAdmin):
    	配置项....
      
    # 使用site
    class UserConfig(admin.ModelAdmin):
    	配置项....
    admin.site.register(CustomAdmin, UserConfig)  # 应用配置项
    

       下面是admin深度配置的一些常用选项。

    from django.contrib import admin
    from .models import *
    # Register your models here.
    
    
    class UserConfig(admin.ModelAdmin):
        # 自定义字段,作用显示
        def edit(self):
            return "编辑"
    
    	# 以下是自定义admin的使用
        # 添加数据模板页
        # 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
        # 弹出框模板页
        # popup_response_template = None
    
        # 不支持多对多字段,展示表中的字段。
        list_display = ["user_id", "user_name","user_gender",edit]
        # 点击字段可进入change页面
        list_display_links = [edit]
        # 过滤筛选,支持各种关系
        list_filter = ["user_gender"]
        # 支持在页面修改的字段,与list_display_links有冲突
        list_editable = ["user_name"]
        # 模糊搜索,可以按照编号、名字搜索.或关系
        search_fields = ["user_id","user_name"]
    
    	# 用于和action定制项做批处理
        def patch_init(self,request,queryset):
            """
            queryset:选中的字典
            """
            # 选中的用户全改为男性...
            queryset.update(user_gender=False)
            # 添加描述
        patch_init.short_description = "批量修改性别"
        actions = [patch_init] 
    
    
    admin.site.register(User)
    

       以下是配置完成后的样式,自行对应配置项进行配置后查看即可。

       image-20201023150242020

    中文显示

       如果想要在admin中进行中文显示,则可以在全局的settings.py中配置语言。

    # LANGUAGE_CODE = 'en-us'
    LANGUAGE_CODE = 'zh-Hans'  # 中文显示
    

    执行流程

       在启动django项目时,第一步会去settings中导入各种模块。

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
    ]
    

       查看admin源码from django.contrib import admin,它下面有这样的一个函数,该函数的作用就是将所有app下的admin都会做一次导入。

    def autodiscover():
        autodiscover_modules('admin', register_to=site)
    

       我们知道,在模块导入时,会运行该模块中的代码,那么在admin.site进行注册时,实际上是应用单例模式进行注册。

       使用admin.site.register()实际上都是在使用单例对象下的方法,并不会重复生成多个对象。

    class AdminSite(object):
    
        def __init__(self):
            self._registry = {}
    
        def register(self, model, admin_class = None):
            # 设置配置类
            if not admin_class:
                admin_class = ModelAdmin
            self._registry[model] = admin_class(model, self)
    
    site = AdminSite()  # 最后一行
    

       admin中单例对象的应用也非常简单,它是以模块的方式应用单例对象,因为我们知道模块只会执行一次。

       如下所示:

    # f1.py 模块
    class Test(object):
    	def __init__(self,name):
    		self.name = name
    
    t1 = Test("测试")
    

       当其他文件进行多次导入时,只会导入一次,此时使用的t1永远都是单例对象,不会重复实例化:

    import f1
    
    f1.t1()
    
  • 相关阅读:
    娿
    我不知道啊
    Android怎么把引入的library库工程转换成jar包
    高斯消元入门和简单应用
    数论函数基本知识
    AC自动机入门和简单应用
    FFT和NTT
    同余系基本知识
    虚树学习笔记
    Windows常用快捷键和基本的Dos命令
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13864356.html
Copyright © 2011-2022 走看看