• admin管理工具


    admin组件使用

    Django 提供了基于 web 的管理工具。

    Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:

    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        "app01"
    ]

    django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。

    激活管理工具

    通常我们在生成项目时会在 urls.py 中自动设置好,

    from django.conf.urls import url
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
    ]

    当这一切都配置好后,Django 管理工具就可以运行了。

    使用管理工具

    启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面,你可以通过命令 python manage.py createsuperuser 来创建超级用户。

    为了让 admin 界面管理某个数据模型,我们需要先在models.py建表再到注册该数据模型到 admin

    admin的定制

    在admin.py中只需要讲Mode中的某个类注册,即可在Admin中实现增删改查的功能,如:

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

    但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:

    方式一:
        class UserAdmin(admin.ModelAdmin):
            list_display = ('user', 'pwd',)
     
        admin.site.register(UserInfo, UserAdmin)       # 第一个参数可以是列表
         
     
    方式二:
        @admin.register(UserInfo)                # 第一个参数可以是列表
        class UserAdmin(admin.ModelAdmin):
            list_display = ('user', 'pwd',)

    ModelAdmin中提供了大量的可定制功能,如

     1. list_display,列表时,定制显示的列。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd', 'xxxxx')   #不能写ManyToMany字段
     
        def xxxxx(self, obj):
            return "xxxxx"

    2. list_display_links,列表时,定制列可以点击跳转。

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd', 'xxxxx')
        list_display_links = ('pwd',)

    3. list_filter,列表时,定制右侧快速筛选。

    4. list_select_related,列表时,连表查询是否自动select_related

    5. list_editable,列表时,可以编辑的列 

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        list_display = ('user', 'pwd','ug',)
        list_editable = ('ug',)

    6. search_fields,列表时,模糊搜索的功能

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
         
        search_fields = ('user', 'pwd')

    7. date_hierarchy,列表时,对Date和DateTime类型进行搜索

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        date_hierarchy = 'ctime'

    8  inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除

    class UserInfoInline(admin.StackedInline): # TabularInline
        extra = 0
        model = models.UserInfo
     
     
    class GroupAdminMode(admin.ModelAdmin):
        list_display = ('id', 'title',)
        inlines = [UserInfoInline, ]

    9 action,列表时,定制action中的操作(批量操作)

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        # 定制Action行为具体方法
        def func(self, request, queryset):
            print(self, request, queryset)
            print(request.POST.getlist('_selected_action'))
         queryset.update(name="xx") #批量更改
    #原理:

        action="func"
        selected_id=[1,2,3]
        queryset=UserInfo.objects.filter(pk__in=selected_id)

        foo(request,queryset)

      (点击批量时前端form表单返回vluae=func和选中的id)
     
        func.short_description = "中文显示自定义Actions"
        actions = [func, ]
     
        # Action选项都是在页面上方显示
        actions_on_top = True
        # Action选项都是在页面下方显示
        actions_on_bottom = False
     
        # 是否显示选择个数
        actions_selection_counter = True

    10 定制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

    11 raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        raw_id_fields = ('FK字段', 'M2M字段',)

    12  fields,详细页面时,显示字段的字段

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        fields = ('user',)

    13 exclude,详细页面时,排除的字段

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        exclude = ('user',)

    14  readonly_fields,详细页面时,只读字段

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        readonly_fields = ('user',)

    15 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        fieldsets = (
            ('基本数据', {
                'fields': ('user', 'pwd', 'ctime',)
            }),
            ('其他', {
                'classes': ('collapse', 'wide', 'extrapretty'),  # 'collapse','wide', 'extrapretty'
                'fields': ('user', 'pwd'),
            }),
        )

    16 详细页面时,M2M显示时,数据移动选择(方向:上下和左右)

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)

    17 ordering,列表时,数据排序规则

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        ordering = ('-id',)
        或
        def get_ordering(self, request):
            return ['-id', ]

    18. radio_fields,详细页面时,使用radio显示选项(FK默认使用select)

    radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL

    19 form = ModelForm,用于定制用户请求时候表单验证

    from app01 import models
    from django.forms import ModelForm
    from django.forms import fields
     
     
    class MyForm(ModelForm):
        others = fields.CharField()
     
        class Meta:
            model = models = models.UserInfo
            fields = "__all__"
     
    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        form = MyForm

    20 empty_value_display = "列数据为空时,显示默认值"

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        empty_value_display = "列数据为空时,默认显示"
     
        list_display = ('user','pwd','up')
     
        def up(self,obj):
            return obj.user
        up.empty_value_display = "指定列数据为空时,默认显示"

    admin源码解析

    单例模式

    理解:https://blog.csdn.net/four_infinite/article/details/52798919          https://www.cnblogs.com/suntp/p/6445286.html

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

    比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

    在 Python 中,我们可以用多种方法来实现单例模式:

    • 使用模块
    • 使用 __new__
    • 使用装饰器(decorator)
    • 使用元类(metaclass)

    (1)使用 __new__

    为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程,代码如下:

    class Singleton(object):
        _instance = None
        def __new__(cls, *args, **kw):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)    
                #执行父类的__new__方法,实例化对象
                #super(Singleton,cls)就相当于实例本身
                 #在python3中super()等同于super(Subway,self)
         return cls._instance 

    class MyClass(Singleton):
       a = 1

    在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance

    执行情况如下:

    >>> one = MyClass() 
    #{实例化过程中:MyClass中没有__init__方法,则走父类Singleton方法,先走__new__方法再走__init__方法} >>> two = MyClass() >>> one == two True >>> one is two True >>> id(one), id(two) (4303862608, 4303862608)

    (2)使用模块

    其实,Python 的模块就是天然的单例模式因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

     1 #single.py
     2 class My_Singleton(object):
     3     def foo(self):
     4         print("foo...")
     5 
     6 my_singleton = My_Singleton()
     7 
     8 print("ok")
     9 
    10 # 打印结果  ok
    11 
    12 ###################################
    13 
    14 #demo.py
    15 
    16 from single import My_Singleton,my_singleton
    17 
    18 my_singleton.foo()
    19 
    20 #打印结果  ok   foo...
    21 
    22 ####################################
    23 
    24 #bin.py
    25 import demo
    26 from single import My_Singleton,my_singleton
    27 
    28 my_singleton.foo()
    29 
    30 #打印结果  ok  foo...  foo...
    31 
    32 同一模块在重复调用时,文件只加载一次
    简单列子

    admin执行流程

     1 - admin源码流程
     2         a. 运行程序,找到每一个app中的 admin.py 文件,并加载
     3             - app01.admin.py 
     4                 - 创建admin.site中的对象
     5                 - 执行对象的 register方法,目的:将注册类添加到 _registry中 
     6                     _registry = {  
     7                         key是传进来的model   value:是ModelAdmin的对象,传了两个参数
     8                         models.Role: ModelAdmin(models.Role,admin.site),
     9                         models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
    10                         models.UserType: ModelAdmin(models.UserType,admin.site)
    11                     }
    12                 
    13             - app02.admin.py
    14                 - 用app01.admin中创建那个admin.site对象
    15                 - 执行对象的 register方法,目的:讲注册类添加到 _registry中 
    16                     _registry = {
    17                         models.Role: ModelAdmin(models.Role,admin.site),
    18                         models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
    19                         models.UserType: ModelAdmin(models.UserType,admin.site)
    20                         models.Article: ModelAdmin(models.Article,admin.site)
    21                     }
    22         
    23             admin.site是一个对象(单例模式创建),其中封装了: 
    24                 _registry = {
    25                     models.Role: ModelAdmin(models.Role,admin.site),
    26                     models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
    27                     models.UserType: ModelAdmin(models.UserType,admin.site)
    28                     models.Article: ModelAdmin(models.Article,admin.site)
    29                 }
    30         b. urls.py 
    31             再次调用 admin.site 对象的 urls属性:
    32                 urlpatterns = [
    33                     url(r'^admin/', admin.site.urls),
    34                 ]
    35             
    36             class ModelAdmin(object):
    37                 def __init__(self,model_class,site):
    38                     self.model_class = model_class
    39                     self.site = site 
    40                     
    41                 def changelist_view(self,request):
    42                     data_list = self.model_class.objects.all()   #是动态的
    43                     return HttpResponse('列表页面')
    44 
    45                 def add_view(self,request):
    46                     return HttpResponse('添加页面')
    47 
    48 
    49                 def delete_view(self,request,nid):
    50                     return HttpResponse('删除页面')
    51 
    52                 def change_view(self,request,nid):
    53                     return HttpResponse('修改页面')
    54                 
    55                 def get_urls(self):
    56                      urlpatterns = [
    57                         url(r'^$', self.changelist_view),
    58                         url(r'^add/$', self.add_view),
    59                         url(r'^(.+)/delete/$', self.delete_view),
    60                         url(r'^(.+)/change/$', self.change_view),
    61                     ]
    62                     return urlpatterns
    63                 
    64                 @property 
    65                 def urls(self):
    66                     return self.get_urls()
    67                 
    68             
    69             class AdminSite(object):
    70                 def __init__(self):
    71                     self._registry = {}
    72                     
    73                 def register(self,model_class,model_admin):
    74                     self._registry[model_class] = model_admin(model_class,self)
    75                 
    76                 def get_urls(self):
    77                     """
    78                     models.Role: ModelAdmin(models.Role,admin.site),
    79                     models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
    80                     models.UserType: ModelAdmin(models.UserType,admin.site)
    81                     models.Article: ModelAdmin(models.Article,admin.site)
    82                     """
    83                     url_list = []
    84                     for model_class,model_admin in self._registry.items():
    85                         model_class是一个类
    86                         app_name = model_class._meta.app_label
    87                         model_name = model_class._meta.model_name 
    88                         url_list += [
    89                             url('%s/%s' %(app_name,model_name,), include(model_admin.urls))
    90                         ]
    91                         
    92                     return url_list
    93                         
    94                 
    95                 @property
    96                 def urls(self):
    97                     return (self.get_urls(), None,None )

    待续

  • 相关阅读:
    qmake Manual (EN) 1
    {转}linux gcc gdb使用
    qmake 简介
    {转}linux makefile 详细教程
    {转}Linux下C开发之——gcc,gdb的使用
    关于“做一个聊天+信息分享客户端”的设想(SNS?)
    {转}算法的力量
    hdu 2047 简单递推公式
    RONOJ 6 金明的预算方案
    hdu 2446 二分搜索解题报告
  • 原文地址:https://www.cnblogs.com/caochao-/p/8534878.html
Copyright © 2020-2023  润新知