Django admin组件的使用


Posted in Python onOctober 24, 2020

admin

adminDjango 自带的后台管理组件,你可以在 admin 中执行增删改查等操作。

它以可视化的方式让你来操纵模型表,十分的便捷。

基本使用
数据准备

如下,在 app01 中有一个这样的模型表:

from django.db import models

# Create your models here.


class User(models.Model):
  user_id = models.AutoField(primary_key=True, verbose_name="用户编号")
  user_name = models.CharField(max_length=32, verbose_name="用户名")
  user_gender = models.BooleanField(
    choices=([0, "male"], [1, "female"]), verbose_name="用户性别")
  user_introduction = models.TextField(
    max_length=1024, null=True, blank=True, verbose_name="用户简介")

  def __str__(self):
    return self.user_name

创建用户

当运行了数据库迁徙命令后,需要创建一个可登录 admin 进行管理的超级账户。

python manage.py createsuperuser

它会提示你输入用户名,以及密码,密码不能少于八位。

可以选填邮箱。

注册admin

管理员用户创建完成后,在 app01 应用下进行注册。

from django.contrib import admin
from .models import *

admin.site.register(User)

接下来打开 admin ,输入账户名与密码后,就可以看到这张表。

Django admin组件的使用

接下来就可以对该表进行增删改查了。

Django admin组件的使用

深度配置

models参数

在创建模型表时,可以对字段添加一些与 admin 相关的参数。

参数 描述
verbose_name Admin中显示的字段名称
blank Admin中进行添加或编辑时,该字段是否可以为空
editable Admin中是否可编辑该字段
help_text Admin中的帮助信息
choices Admin中选择框显示的内容

在这里的 blank verbose_name 以及 choices 都比较常用。

除了在模型表的字段上进行配置外,也可以在该表下定制元信息。这其中有关于该表在 Admin 中的信息显示,如下所示:

class User(models.Model):
	字段 = 类型(条件)
	字段 = 类型(条件)
  class Meta:
    verbose_name = "Admin中显示的表名"

admin配置

如果要对一个注册的表进行深度配置,可在 admin.py 中对它进行。

常用的配置方式有两种,如下所示:

from django.contrib import admin

# 装饰器注册
@admin.register(User)
class UserConfig(admin.ModelAdmin):
	配置项....
 
# 使用site
class UserConfig(admin.ModelAdmin):
	配置项....
admin.site.register(CustomAdmin, UserConfig) # 应用配置项

下面是 admin 深度配置的一些常用选项。

from django.contrib import admin
from .models import *
# Register your models here.


class UserConfig(admin.ModelAdmin):
  # 自定义字段,作用显示
  def edit(self):
    return "编辑"

	# 以下是自定义admin的使用
  # 添加数据模板页
  # 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
  # 弹出框模板页
  # popup_response_template = None

  # 不支持多对多字段,展示表中的字段。
  list_display = ["user_id", "user_name","user_gender",edit]
  # 点击字段可进入change页面
  list_display_links = [edit]
  # 过滤筛选,支持各种关系
  list_filter = ["user_gender"]
  # 支持在页面修改的字段,与list_display_links有冲突
  list_editable = ["user_name"]
  # 模糊搜索,可以按照编号、名字搜索.或关系
  search_fields = ["user_id","user_name"]

	# 用于和action定制项做批处理
  def patch_init(self,request,queryset):
    """
    queryset:选中的字典
    """
    # 选中的用户全改为男性...
    queryset.update(user_gender=False)
    # 添加描述
  patch_init.short_description = "批量修改性别"
  actions = [patch_init] 


admin.site.register(User)

以下是配置完成后的样式,自行对应配置项进行配置后查看即可。

Django admin组件的使用

中文显示

如果想要在 admin 中进行中文显示,则可以在全局的 settings.py 中配置语言。

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans' # 中文显示

执行流程

在启动 django 项目时,第一步会去 settings 中导入各种模块。

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'app01.apps.App01Config',
]

查看 admin 源码 from django.contrib import admin ,它下面有这样的一个函数,该函数的作用就是将所有 app 下的 admin 都会做一次导入。

def autodiscover():
  autodiscover_modules('admin', register_to=site)

我们知道,在模块导入时,会运行该模块中的代码,那么在 admin.site 进行注册时,实际上是应用单例模式进行注册。

使用 admin.site.register() 实际上都是在使用单例对象下的方法,并不会重复生成多个对象。

class AdminSite(object):

  def __init__(self):
    self._registry = {}

  def register(self, model, admin_class = None):
    # 设置配置类
    if not admin_class:
      admin_class = ModelAdmin
    self._registry[model] = admin_class(model, self)

site = AdminSite() # 最后一行

admin 中单例对象的应用也非常简单,它是以模块的方式应用单例对象,因为我们知道模块只会执行一次。

如下所示:

# f1.py 模块
class Test(object):
	def __init__(self,name):
		self.name = name

t1 = Test("测试")

当其他文件进行多次导入时,只会导入一次,此时使用的 t1 永远都是单例对象,不会重复实例化:

import f1

f1.t1()

以上就是Django admin组件的使用的详细内容,更多关于Django admin组件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现巡检系统(solaris)示例
Apr 02 Python
Python和php通信乱码问题解决方法
Apr 15 Python
Python实现多行注释的另类方法
Aug 22 Python
python网络编程之文件下载实例分析
May 20 Python
python下os模块强大的重命名方法renames详解
Mar 07 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
Python 通配符删除文件的实例
Apr 24 Python
vue常用指令代码实例总结
Mar 16 Python
python判断变量是否为列表的方法
Sep 17 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 #Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 #Python
python 带时区的日期格式化操作
Oct 23 #Python
Python可视化工具如何实现动态图表
Oct 23 #Python
python 匿名函数与三元运算学习笔记
Oct 23 #Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 #Python
Python+OpenCV图像处理——实现直线检测
Oct 23 #Python
You might like
做一个有下拉功能的留言版
2006/10/09 PHP
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
ThinkPHP控制器详解
2015/07/27 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
vue-resource 拦截器使用详解
2017/02/21 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
node解析修改nginx配置文件操作实例分析
2019/11/06 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
Python3实现定时任务的四种方式
2019/06/03 Python
python 读取数据库并绘图的实例
2019/12/03 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
毕业生自荐信的主要内容
2013/10/29 职场文书
营销专业应届生求职信
2013/11/26 职场文书
银行办理业务介绍信
2014/01/18 职场文书
酒店端午节促销方案
2014/02/18 职场文书
先进个人推荐材料
2014/12/29 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
无线电知识基础入门篇
2022/02/18 无线电
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android