Django-admin组件

Django-admin组件

admin是django中提供的一套可视化工具:用于对ORM中定义的表进行增删改查。

1 概览

在django项目启动时,自动找到注册到admin中的所有model中定义的类,然后为这些类生成一系列的URL和视图函数,实现基本增删改查等功能。

# admin.py
admin.site.register(models.Depart)
路由:/admin/app名称/model名称//admin/app名称/model名称/add//admin/app名称/model名称/ID值/history//admin/app名称/model名称/ID值/change//admin/app名称/model名称/ID值/delete/

2 基本使用

  • 创建表数据

在这里插入图片描述

  • 创建超级用户,用于登录admin

    python manage.py createsuperuser# 按提示数输入账号,邮箱,密码
    
  • 创建的超级用户数据会保存在数据库user_auth表中

    在这里插入图片描述

  • 登录

    访问路由http://localhost:8000/admin/

    在这里插入图片描述

  • 配置

    在每一个app中有一个admin.py文件,我们可以在这个文件中对想要增删改查的表进行配置

    在这里插入图片描述

    此时再次访问,就可以管理我们已注册的表
    在这里插入图片描述

    关于添加数据的三个选项

在这里插入图片描述

3 admin配置方式

  • 方法一:使用admin.site.register,将自定义的配置类作为参数传递

    在这里插入图片描述

  • 方法二:在自定义类上方使用装饰器admin.register对表进行注册
    在这里插入图片描述

4 源码分析

4.1 加载admin.py

当我们启动Django项目时,Django会首先启动每个app目录下的admin.py文件

执行代码为autodiscover_modules("admin", register_to=site)

在这里插入图片描述
在这里插入图片描述

此时如果我们自定义autodiscover_modules("xxxx")

每次执行django项目时就会默认先去寻找每个项目下的xxxx.py文件执行

当加载admin.py时就会执行admin.site方法

在这里插入图片描述

进入admin.site文件内部,发现site是实例化一个对象

在这里插入图片描述

site实例化的对象实际上是AdminSite,而DefaultAdminSite()实际上是一个**懒加载**的机制

在这里插入图片描述

AdminSite的初始化方法中,定义了一个_registry空字典

在这里插入图片描述

4.2 注册时执行register方法

在这里插入图片描述

self._registry[model] = admin_class(model, self)

将model类作为字典的类,将model的配置对象作为值传到初始化的_registry空字典中

4.3 动态生成URL

urls.py中执行admin.site.urls本质上就是走到sites.py中,并执行get_urls()方法

返回的是一个列表,里面包含了路由分发的数据

注意:由于单例模式,这里admin.site创建的对象与ModelAdmin中创建的对象是同一个,(这使得放数据拿数据是在同一个对象中)

在这里插入图片描述
在这里插入图片描述

最终返回的就是基本的urlpatterns和我们注册的每一个类自动生成的URL

在这里插入图片描述

这里又做了一个嵌套,以app名和表名做前缀,里面又套用了model_admin.urls

如果要看具体的路由分发,要到具体的类下面的urls下面找

这样做可以方便我们进行路由的自定制,重写某个类的urls
在这里插入图片描述

下面来看ModelAdmin中的路由分发,本质上返回的就是一个列表,包含增删改查的具体路由

在这里插入图片描述
在这里插入图片描述

4 常见配置

  • list_display,列表时,定制显示的列。 @admin.display(description="自定义")修改页面显示的标题

    class DepartAdmin(admin.ModelAdmin):list_display = ('id', 'title', 'mine1', 'mine2')@admin.display(description="自定义列")def mine1(self, obj):return obj.title + "123"@admin.display(description="自定义可跳转的列")def mine2(self, obj):return mark_safe(f"<a href='https://www.google.com'>{obj.title}</a>")admin.site.register(models.Depart, DepartAdmin)    
    ---------------------------------------------------------------------------------------------------------
    # 或者	mine.short_description = "自定义"	等同于使用装饰器	@admin.display(description="自定义")
    

    在这里插入图片描述

  • list_display_links,列表时,列可以点击跳转。

    @admin.register(models.Depart)
    class DepartAdmin(admin.ModelAdmin):list_display = ('id', 'title', 'mine')list_display_links = ['title']@admin.display(description="我的自定义")def mine(self, obj):return obj.title + "123"
    
  • list_select_related,列表时,连表查询是否自动select_related

  • 分页相关

    # 分页,每页显示条数list_per_page = 100# 分页,显示全部(真实数据<该值时,才会有显示全部)list_max_show_all = 200# 分页插件paginator = Paginator
    
  • list_editable,列表时,可以编辑的列

    @admin.register(models.Depart)
    class DepartAdmin(admin.ModelAdmin):list_display = ('id', 'title')list_display_links = ['title']
    

    在这里插入图片描述

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

    @admin.register(models.Depart)
    class DepartAdmin(admin.ModelAdmin):search_fields = ['id', 'title']
    

    在这里插入图片描述

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

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

  • 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 按钮后返回列表。
    
  • save_on_top = False,详细页面,在页面上方是否也显示保存删除等按钮

  • action,列表时,定制action中的操作

    @admin.register(models.Depart)
    class DepartAdmin(admin.ModelAdmin):# 定制Action行为具体方法def func(self, request, queryset):print(self, request, queryset)print(request.POST.getlist('_selected_action'))func.short_description = "中文显示自定义Actions"actions = [func, ]# Action选项都是在页面上方显示actions_on_top = True# Action选项都是在页面下方显示actions_on_bottom = False# 是否显示选择个数actions_selection_counter = True
    

    在这里插入图片描述

    当我们选择时会以post请求将表单中的数据发送,可以在request.POST中获取到

  • 定制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
    
  • raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):raw_id_fields = ('FK字段', 'M2M字段',)
    
  • fields,详细页面时,显示字段的字段

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):fields = ('user',)
    
  • exclude,详细页面时,排除的字段

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):exclude = ('user',)
    
  • readonly_fields,详细页面时,只读字段

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):readonly_fields = ('user',)
    
  • 详细页面时,M2M显示时,数据移动选择(方向:上下和左右)

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)
    
  • ordering,列表时,数据排序规则

    @admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):ordering = ('-id',)def get_ordering(self, request):return ['-id', ]
    
  • view_on_site,编辑时,是否在页面上显示view on set

    view_on_site = Falsedef view_on_site(self, obj):return 'https://www.baidu.com'
    
  • form = ModelForm,用于定制用户请求时候表单验证显示的字段

    from app01 import models
    from django.forms import ModelForm
    from django.forms import fieldsclass DepartForm(ModelForm):others = fields.CharField()class Meta:model = models.Departfields = ['id']@admin.register(models.UserInfo)
    class UserAdmin(admin.ModelAdmin):form = DepartForm
    

    在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提高办公效率,实现团队协作——了解ONLYOFFICE

目录 引言现代办公环境中的挑战ONLYOFFICE 一、ONLYOFFICE介绍1.ONLYOFFICE介绍2.基础功能介绍&#xff08;包括协作空间&#xff09;a.全面的办公功能可多人协作的在线文档编辑软件&#xff08;Word&#xff09;强大的在线电子表格编辑软件&#xff08;Excel&#xff09;创造精…

自动化测试web库(元素定位、元素操作、浏览器操作)

按照谷歌浏览器 Chrome &#xff1a;https://googlechromelabs.github.io/chrome-for-testing/ Chrome使用技巧&#xff1a; 1、找到自己想要的标签 打开检查&#xff0c;点击箭头&#xff0c;再点击你想要点击的地方 2、直接在浏览器上查询&#xff0c;看看是否查询成功 可…

SpringBoot+阿里云实现验证码登录注册及重置密码

开通阿里云短信服务 阿里云官网 创建API的Key 可以使用手机号或者刷脸来进行创建Key 创建成功 开通完成以后接下来实现代码请求阶段 配置maven依赖 <!-- 阿里云 oss 短信 依赖--><dependency><groupId>com.aliyun</groupId><artifactId>dysm…

三、VUE数据代理

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 Object.defineProperty() Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性&#xff0c;或修改其现有属性&#xff0c;并返回此对象。 Object.defineProperty() 数据代理 通过一个对象代理另一个对象中属…

【imazing骗局】imazing软件安全吗 需要越狱吗 为什么iPhone都会装iMazing来管理

鉴于苹果设备的封闭性与安全性&#xff0c;我们大部分情况下都需要搭配iTunes进行设备的管理。但作为一款全方位的iOS设备管理软件&#xff0c;iMazing竟然可以突破iTunes的限制&#xff0c;与设备直接连接&#xff0c;进行备份、管理等操作。 因此&#xff0c;很多人都会有疑…

太速科技-基于6U CPCIe的TMS320C6678+KU060的信号处理板卡

基于6U CPCIe的TMS320C6678KU060的信号处理板卡 一、板卡概述 基于6U CPCIe的C6678KU060的信号处理板卡是新一代FPGA的高性能处理板卡。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司 XCKU060-2FFVA1156I作为主处理器&#xff0c;Xilinx 的Aritex XC7A200T作为辅助处…

数据结构——栈的应用

数据结构——栈的应用 括号匹配中缀转后缀什么是中缀后缀中缀表达式 (Infix Notation)后缀表达式 (Postfix Notation, Reverse Polish Notation, RPN) 加减&#xff0c;乘除运算处理括号后缀转中缀 我们今天来看栈的应用&#xff1a; 括号匹配 栈一个经典的应用就是括号匹配&…

set_input_delay的理解

1&#xff0c;set_input_delay约束理解 input_delay是指输入的数据到达FPGA的pad引脚时相对于时钟边沿的延迟有多大&#xff0c;单位是ns&#xff0c;数值可以是正&#xff0c;也可以是负。通过set_input_delay约束告诉编译器输入时钟和输入数据的相位关系。如下图所示假设时钟…

数字IC后端先进工艺设计实现之TSMC 12nm 6Track工艺数字IC后端实现重点难点盘点

大家知道咱们社区近期TSMC 12nm ARM Cortexa-A72(1P9M 6Track Metal Stack)已经开班。这里小编要强调一点:不要认为跑了先进工艺的项目就会很有竞争力&#xff01;如果你仅仅是跑个先进工艺的flow&#xff0c;不懂先进工艺在数字IC后端实现上的不同点&#xff0c;为何有这样的不…

推荐一个wordpress免费模板下载

首页大背景图&#xff0c;首屏2张轮播图&#xff0c;轮换展示&#xff0c;效果非常的炫酷&#xff0c;非常的哇噻&#xff0c;使用这个主题搭建的wordpress网站&#xff0c;超过了200个&#xff0c;虽然是一个老主题了&#xff0c;不过是经得起时间考验的&#xff0c;现在用起来…

[iOS]使用CocoaPods发布公开库

1.检查库名是否已被占用 选择库名时&#xff0c;尽量选择具有描述性并且独特的名字&#xff0c;这不仅可以避免命名冲突&#xff0c;还可以帮助用户更好地理解库的用途和功能。 在实际创建和发布 CocoaPods 库之前&#xff0c;确实应该检查库名是否已经被占用&#xff0c;以避…

敏捷之Scrum开发

目录 一、什么是 Scrum 1.1 Scrum 的定义 二、Scrum 迭代开发过程 2.1 迭代开发过程说明 2.1.1 开发方法 2.1.1.1 增量模型 2.1.1.1.1 定义 2.1.1.1.2 模型方法说明 2.1.1.2 迭代模型 2.1.1.2.1 定义 2.1.1.2.2 模型方法说明 2.1.2 迭代过程 2.1.2.1 产品需求Produ…

万万没想到,原来这些维生素对帕金森有好处!

亲爱的读者朋友们&#xff0c;今天我们要聊一个特别的群体——帕金森病患者。在面对这一神经系统退行性疾病时&#xff0c;除了遵循医嘱进行药物治疗和康复锻炼&#xff0c;合理的饮食和营养补充也显得尤为重要。那么&#xff0c;究竟哪些维生素是他们不可或缺的呢&#xff1f;…

go语言实现简单登陆返回token样例

目录 1、代码实现样例&#xff1a; 2、postman调用&#xff0c;获取登陆后的token&#xff1a; 1、代码实现样例&#xff1a; package mainimport ("net/http""time""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var …

【代码问题】【Pytorch】训练模型时Loss为NaN或INF

解决方法或者问题排查&#xff1a; 加归一化层&#xff1a; 我的问题是我新增的一个模块与原来的模块得到的张量相加&#xff0c;原张量是归一化后的&#xff0c;我的没有&#xff1a; class Module(nn.Module):def __init__(self,dim,):super().__init__()# 新增一个LayerNo…

python学习笔记B-13:序列结构之元组--元组的相关操作

元组的常用相关操作有&#xff1a;获取最大值、获取最小值、获取元组长度、查询是否包好某元素、获取元素索引值、获取元素数量 t (2,4,6,90,34,25,78) print("原元组&#xff1a;",t) print("最大值&#xff1a;",max(t)) print("最小值&#xff1…

matlab新手快速上手3(差分进化算法)

本文用经典差分进化框架模板&#xff0c;对matlab新手友好&#xff0c;快速上手看懂matlab代码&#xff0c;快速应用实践&#xff0c;源代码在文末给出。 差分进化算法定义&#xff1a; 差分进化算法&#xff08;Differential Evolution&#xff0c;简称DE算法&#xff09;是…

KUKA机器人如何给IO信号或寄存器添加中文注释信息?

KUKA机器人如何给IO信号或寄存器添加中文注释信息? 如下图所示,首先,我们需要登录专家以上用户权限(默认密码KUKA), 如下图所示,点击“投入运行”—“网络配置”, 如下图所示,此时机器人的IP地址为192.168.1.10, 如下图所示,用一根网线连接机器人控制柜到笔记…

基于SpringBoot+Vue大学生兼职管理系统的设计与实现

目录 一、前言介绍 二、功能需求 三、功能结构设计 四、管理员功能实现 招聘单位管理 用户管理 论坛管理 公告信息管理 五、招聘单位功能实现 职位招聘管理 职位留言管理 简历投递管理 六、用户功能实现 在线论坛 职位招聘信息 简历投递 简历 七、部分核心代码 …

【C语言进阶】程序编译中的预处理操作

&#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容讲解C语言中程序预处理要做的事情 目录 1.1 预处理符号 1.2 #define 1.2.1 #define定义标识…