Django之DjangoAdmin

Posted Python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 以上是关于Django之DjangoAdmin的主要内容,如果未能解决你的问题,请参考以下文章

# Django adminform表单的应用记录

十Django之Admin

Django Admin - 悬停时显示图像

Django之auth模块

Django之ModelForm验证

django admin - 匹配的查询不存在