• Django之DjangoAdmin


     

    前言:

    当我们启动1个Django程序的时候,在程序的settings.py配置文件默认注册了1个名为'django.contrib.admin'的APP程序,并且配置了默认路由映射关系url(r'^admin/', admin.site.urls),这就是我们在安装Django时安装的后台管理插件DjangoAdmin,帮助我们快速对在model中定义的类(表)做增、删、改、查操作;

     

    一、DjangoAdmin的基本使用

    0、准备

    创建admin后台管理用户

    python manage.py createsuperuser

    修改用户名密码

    D:Sensors_Data>python manage.py changepassword zhanggen
    Changing password for user 'zhanggen'
    Password:
    Password (again):
    Passwords do not match. Please try again.
    Password:
    Password (again):
    Password changed successfully for user 'zhanggen'

    创建数据库表

    from django.db import models
    
    class UserGroup(models.Model):
        title = models.CharField(verbose_name='组名称',max_length=32)
        def __str__(self):
            return self.title
    
    class Role(models.Model):
        name= models.CharField(verbose_name='角色名称',max_length=32)
    
    class UserInfo(models.Model):
        group = models.ForeignKey(verbose_name='用户组',to=UserGroup,null=True,blank=True)
        name = models.CharField(verbose_name='用户名',max_length=32)
        nickname =  models.CharField(verbose_name='昵称',max_length=32,null=True,blank=True)
        email = models.EmailField(verbose_name='邮箱',max_length=32)
        ctime = models.DateTimeField(verbose_name='创建时间',null=True,blank=True)
        roles = models.ManyToManyField(verbose_name='角色',to=Role)
        def __str__(self):
            return self.name
    View Code

    将表注册到admin.py

    from django.contrib import admin
    
    from . import models
    admin.site.register(models.UserInfo)
    admin.site.register(models.UserGroup)
    View Code

    设置编码

    ALTER TABLE django_admin_log MODIFY COLUMN object_repr VARCHAR(255)  CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

    setings.py设置中文版DjangoAdmin

    LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'Asia/Shanghai'

    1、使用DjangoAdmin进行数据库表的增、删、改、查操作,发现URL规则;

    查看X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/

    增加X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/add/

    删除X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/2/del/

    编辑X表数据:DjangoAdmin生成url:  http://127.0.0.1:8000/admin/app01/userinfo/2/change/

    发下URL规则:/app名称/表名/pk/操作

    2、产生疑问 DjangoAdmin的URL是怎么通过组册到admin的表名自动生成的呢?

    这就要看这行代码做了什么?

    url(r'^admin/', admin.site.urls),

    2.1.返回self.get_urls(),方法, 'admin', self.name

    2.2.site对象的get_urls方法生成登录、注销、设置密码。。。url映射关系

    2.3、还有

     2.4、生成增、删、改、查的路由

    2.5、猜想:Djangoadmin根据admin.py中注册的表名,自动生成/app名称/表名/pk/操作 这样的url映射关系

    二、自定义DjangoAdmin配置对象

     1、通过 list_display列表,自定制显示数据库中已有列

    from django.contrib import admin
    
    from . import models
    
    
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
    
    
    admin.site.register(models.UserInfo,Zhanggen)
    admin.site.register(models.UserGroup)
    View Code

    通过装饰器的方式自定义配置类

    @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','xx',]  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        def xx(self,obj):  #obj =当前行的对象
            # return '自定义列'+obj.name
            tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
            return tpl
    
    # admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
    admin.site.register(models.UserGroup)
    View Code

    2、通过 list_display列表,自定制显示的列(数据库中没有的字段)

    from django.contrib import admin
    from . import models
    from django.utils.safestring import mark_safe
    
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','xx',]  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        def xx(self,obj):  #obj =当前行的对象
            # return '自定义列'+obj.name
            tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
            return tpl
    
    admin.site.register(models.UserInfo,Zhanggen)
    admin.site.register(models.UserGroup)
    View Code

    3、list_display_links 设置显示的列可以跳转

    from django.contrib import admin
    from . import models
    from django.utils.safestring import mark_safe
    
    # @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','xx',]  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        list_display_links = ['name','nickname']  #定制可以跳转的字段
        def xx(self,obj):  #obj =当前行的对象
            # return '自定义列'+obj.name
            tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
            return tpl
    
    admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
    admin.site.register(models.UserGroup)
    View Code

    4、list_filter = ['group']  定制右侧筛选条件

    from django.contrib import admin
    from . import models
    from django.utils.safestring import mark_safe
    
    # @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname',]  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        list_display_links = ['name','nickname',]  #定制可以跳转的字段
        list_filter = ['group','name']              #定制右侧筛选条件
        # def xx(self,obj):  #obj =当前行的对象
        #     # return '自定义列'+obj.name
        #     tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
        #     return tpl
    
    admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
    admin.site.register(models.UserGroup)
    View Code

    自定制筛选分组 和页面数据筛选条件

    from django.contrib import admin
    from . import models
    from django.utils.translation import ugettext_lazy as _
    from django.utils.safestring import mark_safe
    
    # @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        # list_display_links = ['name','nickname',]  #定制可以跳转的字段
    
       #自定制 分组 和筛选的条件
        class Ugg(admin.SimpleListFilter):
            title = _('圣诞快乐的解决')
            parameter_name = 'xxxxxx' #点击组名 a标签携带的值,执行queryset方法
    
            def lookups(self, request, model_admin):
                """
                显示筛选选项
                :param request:
                :param model_admin:
                :return:
                """
                return models.UserGroup.objects.values_list('id','title')
    
            def queryset(self, request, queryset):
                """
                点击筛选查询时候,筛选用户表符合筛选条件的内容
                """
                v = self.value()
                if v:
                    return queryset.filter(group_id=v)
                else:
                    return queryset    # print(queryset)   #查询userinfo表的全部数据
              
    
        list_filter = ['group',Ugg]      #定制右侧筛选条件,通用场景把组里所有的人列出来
        # def xx(self,obj):  #obj =当前行的对象
        #     # return '自定义列'+obj.name
        #     tpl=mark_safe('<a href="http://news.baidu.com/?tn=news/">链接</a>'.format(obj.pk))
        #     return tpl
    
    admin.site.register(models.UserInfo,Zhanggen) #支持表名使用[models.UserInfo,models.Group],共同使用zhangen配置,一般不常用
    admin.site.register(models.UserGroup)
    View Code

    5、list_select_related = ['group'],如果显示的列间存在foreign key关系,可以自动select_related,提高性能;

    6、分页相关

      list_per_page = 1  #一页显示数据库中多少条数据
        list_max_show_all = 200 #最大显示行数
        paginator = Paginator
    View Code

    7、list_editable = ['nickname', ]进入编辑模式

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_editable = ['nickname', ] #进入编辑模式
        list_display = ['name','nickname','group']  
    View Code

    8、search_fields = ('name',) #根据字段,做模糊搜索功能

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        search_fields = ('name',)
        list_display = ['name','nickname','group']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
    View Code

    9、 date_hierarchy = 'ctime',列表时,对Date和DateTime类型进行搜索

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        date_hierarchy = 'ctime' #根据时间进行筛选
    View Code

    10、preserve_filters=True,页面跳转回来之后保留搜素条件

    10、 save_as = False,详细页面,按钮为“Sava as new” 或 “Sava and add another”

    11.、save_as_continue = True,点击保存并继续编辑

    12、inlines = [UserInfoInline, ],在操作foreign key的表时,联动操作从表;(在增加组的时候,也可以增加组里的用户)

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

    主表和从表直间 横向显示,继承TabularInline类

    class UserInfoInline(admin.TabularInline):  # 继承TabularInline类,排列的方式不同
        extra = 0
        model = models.UserInfo
    
    class GroupAdminMode(admin.ModelAdmin):
        list_display = ( 'title',)
        inlines = [UserInfoInline, ]
    
    admin.site.register(models.UserGroup,GroupAdminMode)
    View Code

    13、扩展admin的操作,actions = [zhanggen,]   例如:增、删、改、查

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        search_fields = ('name',)  # 根据字段搜素,框
        def zhanggen(self,request,queset):
            print(self,request,queset)
            print(request.POST.getlist('_selected_action'))  #拿到前端选择 的id
        zhanggen.short_description = '中文显示自定义Actions'
        actions = [zhanggen,]
    View Code

    14、change_list_template = ['test.html']  把DjangoAdmin的路径,更换成自己的模板路径;

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        change_list_template = ['test.html'] #更换自己的查询时显示模板路径
        add_form_template = ['add.ttml']   #增加
        delete_confirmation_template = None #删除
        delete_selected_confirmation_template = None ##选中之后批量
        object_history_template = None
    View Code

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

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        raw_id_fields = ('group', 'roles',) #在详细页面,把'FK字段', 'M2M字段'显示成input框
    View Code

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

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        fields = ['name','nickname']  #定义显示页面,显示的字段
    View Code

    17、exclude = ['name'] 配置显示页面,不显示的字段

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        exclude = ['name']  #定义显示页面,不显示的字段
    View Code

    18、readonly_fields = ['name'] 配置显示页面,某字段只读不允许修改

    19、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'),
            }),
        )
    View Code

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

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        filter_vertical = ("roles",) #选中多对多字段时,上下显示
        filter_horizontal=('roles') #选中多对多字段时,左右显示
    View Code

    21、ordering = ('-id',)  数据排序规则

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        # ordering = ('id',)   #按id大小 排序显示
        ordering = ('-id',)#倒序显示
    View Code

    22、view_on_site,编辑页面,显示view on set按钮,可以设置 跳转会显示页面

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
    
        def view_on_site(self, obj):
            return 'https://www.baidu.com'
    View Code

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

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

    24、show_full_result_count = True,列表时,模糊搜索后面显示的数据个数样式

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        search_fields = ('user',)
        show_full_result_count = True  # 1 result (12 total)
    View Code

    25、 formfield_overrides = {},详细页面时,指定现实插件

    from django.forms import widgets
    from django.utils.html import format_html
     
    class MyTextarea(widgets.Widget):
        def __init__(self, attrs=None):
            # Use slightly better defaults than HTML's 20x2 box
            default_attrs = {'cols': '40', 'rows': '10'}
            if attrs:
                default_attrs.update(attrs)
            super(MyTextarea, self).__init__(default_attrs)
     
        def render(self, name, value, attrs=None):
            if value is None:
                value = ''
            final_attrs = self.build_attrs(attrs, name=name)
            return format_html('<textarea {}>
    {}</textarea>',final_attrs, value)
     
     
     
    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        formfield_overrides = {
            models.models.CharField: {'widget': MyTextarea},
        }
    View Code

    26、prepopulated_fields = {},同步填充input框中的数据

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        prepopulated_fields = {"email": ("name", "nickname",)}
    View Code

    27. form = ModelForm,自定义 表单验证组件

    from django.contrib import admin
    from django.core.paginator import Paginator
    from . import models
    from django.utils.translation import ugettext_lazy as _
    from django.utils.safestring import mark_safe
    from django.forms import ModelForm
    from django.forms import fields
    
    class MyForm(ModelForm):
        others = fields.CharField()
    
        class Meta:
            model = models = models.UserInfo
            fields = "__all__"
            error_messages = {'name': {'required': '用户不能为空'}}
    
    
    # @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        form = MyForm
    View Code

    28. 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 = "指定列数据为空时,默认显示"
    View Code

    三、DjangoAdmin配置总结:

    每个注册到DjangoAdmin的1张表对应一个自定制类(继承admin.ModelAdmin默认配置类),表中数据按配置进行显示;2张表的自定义的配置类相互不影响,如果没有自定义配置类,会自动使用默认配置;

    使用:

    1、在model.py中创建表

    2、把表名注册到admin.py

    A、admin.site.registe(表名,自定义配置类)

    admin.site.register(models.UserInfo,Zhanggen)
    View Code

    B、装饰器方式注册表

    # @admin.register(models.UserInfo)  #使用装饰器的方法,注册表到admin
    View Code

    3.自定义配置类,扩展功能

    类名(admin.ModelAdmin)注意继承默认配置,才能扩展功能;

    class Zhanggen(admin.ModelAdmin): #必须继承admin.ModelAdmin基础配置类
        list_display = ['name','nickname','group','ctime']  #列表中 包含数据库中哪个字段,就在DjangoAdmin页面显示哪个字段
        form = MyForm
    View Code

    通过在每张表中 定义配置类的静态字段,显示表中内容

    4、自动生成了表名对应的URL映射发下URL规则:/app名称/表名/pk/操作

    参考博客链接银角大王:http://www.cnblogs.com/wupeiqi/articles/7444717.html

  • 相关阅读:
    linux内核——进程切换宏switch_to
    android源码目录结构详解
    SRM 390(1-250pt)
    SRM 391(1-250pt)
    CodeForces 221(div 2)
    SRM 407(1-250pt, 1-500pt)
    SRM 392(1-250pt)
    SRM 393(1-250pt)
    CodeForces 220(div 2)
    SRM 406(1-250pt, 1-500pt)
  • 原文地址:https://www.cnblogs.com/sss4/p/7703592.html
Copyright © 2020-2023  润新知