zoukankan      html  css  js  c++  java
  • django中的django admin插件

    一、django admin前言

      1、admin的作用

        为了方便后台开发者快速的部署测试环境,于是就产生了admin,admin主要是操作models中的类从而实现对数据库中的数据增删改查的操作。

      2、admin的使用环境

        1、首先项目中的models.py必须要有相应的类

        from django.db import models
        class UserInfo(models.Model):
          name=models.CharField(max_length=32)
          email=models.EmailField(max_length=32)
        class GroupInfo(models.Model):
          groupname=models.CharField(max_length=32)
          nickname=models.CharField(max_length=32)
    

           2、然后在项目中的admin.py设置admin所需要操作哪些类(相当于为表注册路由)

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

       3、admin.py设置成功之后就会自动注册路由(自动注册路由要参考django源码),路由格式如下:

    	/admin/app01/userinfo/   			查看表数据 change_list_view
    	/admin/app01/userinfo/add/  			增加表数据 方法
    	/admin/app01/userinfo/2/change/			修改表数据 方法  2指代的是主键id号
    	/admin/app01/userinfo/2/delete/			删除表数据 方法
        注释:app01指代的是项目名,在哪个项目下创建数据库就写的是哪个项目,userinfo指代的是项目下的表名,然后后面就是对该表进行增删改查的相关操作。

        除此之外还会创建别的路由映射关系
        /admin/
        /admin/login/
        /admin/logout/
        /admin/password_change/
        /admin/password_change/done/  
        
    /admin/app名称/model名称/
        /admin/app名称/model名称/add/
        /admin/app名称/model名称/ID值/history/
        /admin/app名称/model名称/ID值/change/
        /admin/app名称/model名称/ID值/delete/

        4、进入admin后台配置页面

      

        注释:后台显示一张userinfo表中的所有数据之所以显示的是UserInfo object是因为后台取的是一条记录的所有数据信息,即一条记录就是一个对象。如果通过value方式取数据得到的是列表内套字典,如果通过value_list取数据得到的是一个元组,所有大胆猜测后台是通过.all的方法将每一条记录数据全部取出来,所有得到的是个对象。

        5、models.py中的__str__方法

    class UserInfo(models.Model):
        name=models.CharField(max_length=32)
        email=models.EmailField(max_length=32)
        def __str__(self):
            return self.name
    注释:该方法的作用就是在后台管理页面自己定义需要显示的文字,但是只能显示记录中的某一个字段,尽管可以通过字符串拼接但是太娄比。

     二、自己定制admin方法

      1、注册Mode中的类

        方式一:直接注册

    from django.contrib import admin
    from . import models
    class zhangsan(admin.ModelAdmin):
        list_display = ['name','xxx']
        def xxx(self,obj):
            return 'xxx'
    admin.site.register(models.GroupInfo)          # 第一个参数可以是列表
    admin.site.register(models.UserInfo,zhangsan)
    注释:必须先创建一个类然后注册model.py中类的时候写入之前注册的类

        方式二:通过装饰器注册

    from django.contrib import admin
    from . import models
    @admin.register(models.UserInfo)  # 第一个参数可以是列表
    class UserAdmin(admin.ModelAdmin):
        list_display = ('name', 'email','xx')
        def xx(self,obj):
            return 'aaaaaaaa'
    注释:装饰器的作用就想当是注册了类,所以省略了注册类这一步

       2、ModelAdmin中可定制功能的方法

        1、list_display,在列表中,定制需要显示的字段(如果需要显示的字段在表记录中没有,就需要自己构造个函数,如下图所示,xxx为函数名,obj是该条记录对象)

    from django.contrib import admin
    from . import models
    class zhangsan(admin.ModelAdmin):
        list_display = ['name','xxx']
        def xxx(self,obj):
            return 'xxx'
    admin.site.register(models.GroupInfo)
    admin.site.register(models.UserInfo,zhangsan)
    

         2、list_display_links,在列表中,定制字段可以点击跳转(可以跳转至任意位置)

    from django.contrib import admin
    from . import models
    from django.utils.safestring import mark_safe
    class zhangsan(admin.ModelAdmin):
        list_display = ['name','email','xxx']
        list_display_links = ['name','email','xxx']
        def xxx(self,obj):
            tpl='<a href="http://www.baidu.com">%s</a>'%obj.name
            return mark_safe(tpl)
    
    admin.site.register(models.UserInfo,zhangsan)
    

         3、list_filter,在列表中,定制右侧快速筛选。

      方式1:

    from django.contrib import admin
    from . import models
    from django.utils.safestring import mark_safe
    class zhangsan(admin.ModelAdmin):
        list_display = ['name','email','xxx']
        list_display_links = ['name','email','xxx']
        list_filter = ['name']
        def xxx(self,obj):
            tpl='<a href="http://www.baidu.com">%s</a>'%obj.name
            return mark_safe(tpl)
    admin.site.register(models.UserInfo,zhangsan)

        方式2:修改右侧窗口显示

    from django.contrib import admin
    from . import models
    from django.utils.translation import ugettext_lazy as _
    class zhangsan(admin.ModelAdmin):
        list_display = ('name', 'email')
        class Ugg(admin.SimpleListFilter):
            title = _('组名')
            parameter_name = 'xxxxxx'
            def lookups(self,request,model_admin):
                # 显示右侧需要查看的列
                return models.UserInfo.objects.values_list('name','id')
            def queryset(self, request, queryset):
                # queryset指代的是每一条记录对象
            
    return queryset # return queryset.filter(name='张三') list_filter = ('name', Ugg,'email') admin.site.register(models.UserInfo,zhangsan)

        4、list_select_related,在列表中,连表查询是否自动select_related

          格式:list_select_related=["外键字段名"]

        5、分页相关

    # 分页,每页显示条数
        list_per_page = 100
    # 分页,显示全部(真实数据<该值时,才会有显示全部)
        list_max_show_all = 200
    # 分页插件
        paginator = Paginator

        6、list_editable,在列表中,显示可以编辑的字段

          格式:list_editable=["字段名"]

        7、search_fields,在列表中,设置可以进行模糊搜索功能的字段

          格式:search_fields=["字段名"]

        8、date_hierarchy,在列表中,对Date和DateTime类型进行搜索

          格式:date_hierarchy = '字段名'               

           eg:在model中设置 ctime = models.DateTimeField(null=True, blank=True)

            在admin中设置 date_hierarchy = 'ctime

        9、preserve_filters,详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件,默认是保存状态

          格式:preserve_filters = True

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

          格式:save_as = False

        11、save_as_continue ,点击保存并继续编辑默认为True

          格式:save_as_continue = True

    save_as_continue = True
    # 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。
    # 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。
     
    

        12、save_on_top ,详细页面,在页面上方是否也显示保存删除等按钮,默认为False

          格式:save_on_top = False

        13、 inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除,切记是在非主键表中写 inlines

          举例:用户表和用户组表是多对一关系,主键写在用户表中,就可以给用户组表写上inlines,然后就可以在用户组表中动态添加和删除用户。

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

         14、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'))      获取到id列表
     
        func.short_description = "中文显示自定义Actions"
        actions = [func, ]
     
        # Action选项都是在页面上方显示
        actions_on_top = True
        # Action选项都是在页面下方显示
        actions_on_bottom = False
     
        # 是否显示选择个数
        actions_selection_counter = True
    

         15、定制HTML模板

    add_form_template = None
    change_form_template = None
    change_list_template = None                          #为None表示默认admin后台使用的是django提供的默认模版,如果写为change_list_template = ['模板路径']则admin后台使用我们自定义的模板
    delete_confirmation_template = None
    delete_selected_confirmation_template = None
    object_history_template = None
    

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

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

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

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

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

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

         19、readonly_fields,详细页面时,只读字段

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

        20、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'),
            }),
        )
    

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

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

         22、ordering,列表时,数据排序规则

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

         23、view_on_site,编辑时,是否在页面上显示view on set

    view_on_site = False
    或
    def view_on_site(self, obj):
        return 'https://www.baidu.com'
    

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

      

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

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

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
        # show_full_result_count = True # 1 result (12 total)
        # show_full_result_count = False  # 1 result (Show all)
        search_fields = ('user',)
    

         26、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},
        }
    

         27、prepopulated_fields = {},添加页面,当在某字段填入值后,自动会将值填充到指定字段。

      

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):
     
        prepopulated_fields = {"email": ("user","pwd",)}
    
    PS: DjangoAdmin中使用js实现功能,页面email字段的值会在输入:user、pwd时自动填充
    

         28、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
    

         29、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.ModelAdmin,都需要在类中写一个可迭代序列)

      (总注册类时默认admin_class=None,默认使用admin.ModelAdmin内的方法,如果需要自定制功能就需要继承admin.ModelAdmin类)

  • 相关阅读:
    oracle 判断字符串是否包含指定内容
    java 如何使用多线程调用类的静态方法?
    oracle 快速复制表结构、表数据
    oracle 清空表数据的2种方式及速度比较
    一、Instrument之Core Animation工具
    net登录积分(每天登录积分仅仅能加一次) 时间的比較
    正规方程 Normal Equation
    笑谈贝叶斯网络(干货)上
    SQL SERVER 面试题
    好的创始人想要改变世界,最好的创始人还要不放弃——扎克伯格清华中文演讲
  • 原文地址:https://www.cnblogs.com/xuanan/p/7688375.html
Copyright © 2011-2022 走看看