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 {}>\r\n{}</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类)

 

posted @ 2017-10-18 19:24  mx轩  阅读(593)  评论(0编辑  收藏  举报