随笔 - 105  文章 - 0  评论 - 0  阅读 - 40744

Django之Admin

一般使用步骤

步骤一、创建超级用户:python manage.py createsuperuser
步骤二、建立数据模型,本次都是以下面的数据模型为例

数据模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.db import models
Create your models here.
class Department(models.Model):
"""部门表"""
name = models.CharField(max_length=32)
def __str__(self):
    return self.name
 
class UserInfo(models.Model):
"""用户表"""
name = models.CharField(max_length=32)
email = models.EmailField()
dp = models.ForeignKey(to='Department', on_delete=models.CASCADE)
class Role(models.Model):
"""角色表"""
name = models.CharField(max_length=32)
users = models.ManyToManyField(to='UserInfo')

步骤三、在app文件夹下的admin.py中注册模型,如下:

admin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.contrib import admin
from app01 import models
<h1 id="register-your-models-here">Register your models here.</h1>
<h1 id="新增url">新增URL</h1>
<h1 id="adminapp01department-----显示列表">admin/app01/department/    # 显示列表</h1>
<h1 id="adminapp01departmentadd---添加数据">admin/app01/department/add  # 添加数据</h1>
<h1 id="adminapp01department1change--编辑数据">admin/app01/department/1/change/ # 编辑数据</h1>
<h1 id="adminapp01department1change---删除数据">admin/app01/department/1/change  # 删除数据</h1>
<p>admin.site.register(models.Department)</p>
<h1 id="新增url-1">新增URL</h1>
<h1 id="adminapp01userinfo-----显示列表">admin/app01/userinfo/    # 显示列表</h1>
<h1 id="adminapp01userinfoadd---添加数据">admin/app01/userinfo/add  # 添加数据</h1>
<h1 id="adminapp01userinfo1change--编辑数据">admin/app01/userinfo/1/change/ # 编辑数据</h1>
<h1 id="adminapp01userinfo1change---删除数据">admin/app01/userinfo/1/change  # 删除数据</h1>
<p>admin.site.register(models.UserInfo)</p>

这个步骤的作用是注册模型,新增URL以供path('admin/', admin.site.urls)使用。

步骤四、登陆/admin/来增删改查。

进阶-定制页面

每个数据表都有其对应的页面,可以不同的数据表定制不同的页面。

使用方法

步骤一、利用类定义页面信息,必须继承admin.ModelAdmin
步骤二、在admin.site.register的第二个参数时填入步骤一中的类名。
案例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class UserInfoConfig(admin.ModelAdmin):  # 定义用户信息界面的配置信息,必须继承admin.ModelAdmin
    list_display = ['id', 'name', 'email', 'dp', 'delete', 'edit', ]  # 定义网页中显示的字段
    # 其中delete和edit结合以下的delete和edit函数使用
    list_display_links = ['id'# 定义网页中可链接的字段
    list_filter = ['name', 'dp'# 定制过滤的字段
    list_editable = ['name', 'email'# 定制可编辑的字段,不过此字段不能出现在list_display_links中
    search_fields = ['name', 'email'# 定义搜索的字段
    save_on_top = True  # 在顶部也存在保存按钮
 
    def func(self, request, queryset):
        """定义方法,以便在actions中选定时执行"""
        print(request.POST.getlist('_selected_action'))
 
    func.short_description = '显示ID'  # 在actions选择框中显示
    actions = [func, ]
 
    def delete(self, obj):
        return mark_safe('<a>删除</a>')
 
    def edit(self, obj):
        return '编辑'
 
 
admin.site.register(models.UserInfo, UserInfoConfig)

在反向关联管理页面中显示关联页面

表结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Trigger(models.Model):
    """触发器"""
    name = models.CharField(max_length=64, verbose_name='触发器名称')
    severity_choices = ((0, 'Information'),
                        (1, 'Warning'),
                        (2, 'Average'),
                        (3, 'High'),
                        (4, 'Disaster'))
    severity = models.IntegerField(choices=severity_choices, verbose_name='告警级别')
    enable = models.BooleanField(default=True)
    memo = models.TextField(verbose_name='备注', blank=True, null=True)
 
 
class TriggerExpression(models.Model):
    """触发器表达式"""
    trigger = models.ForeignKey('Trigger', on_delete=models.CASCADE, verbose_name='所属触发器')
    service = models.ForeignKey('Service', on_delete=models.CASCADE, verbose_name='关联服务')
    service_index = models.ForeignKey(ServiceIndex, verbose_name='关联服务指标', on_delete=models.CASCADE)
    specified_index_key = models.CharField(verbose_name='只监控专门指定的指标key', max_length=64, blank=True, null=True)
    operator_type_choices = (('gt', '>'),
                             ('lt', '<'),
                             ('eq', '='))
    operator_type = models.CharField(max_length=32, choices=operator_type_choices, verbose_name='运算符')
    threshold = models.IntegerField(verbose_name='阈值')
    logic_type_choices = (('and', 'AND'),
                          ('or', 'OR'))
    logic_type = models.CharField(verbose_name='与一个条件的逻辑关系', choices=logic_type_choices,
                                  max_length=32, blank=True, null=True)
    data_calc_type_choices = (('avg', 'Average'),
                              ('max', 'Max'),
                              ('hit', 'HIT'),
                              ('last', 'Last'))
    data_calc_func = models.CharField(max_length=64, choices=data_calc_type_choices, verbose_name='数据处理方式')
    data_calc_args = models.CharField(max_length=64, verbose_name='函数传入参数')

如果想要求在trigger这个表中也可以查看triggerexpression(反射关联trigger),则需要在admin.py中添加以下代码

1
2
3
4
5
6
7
8
# 注意继承了admin.TabularInline
class TriggerExpressionInline(admin.TabularInline):
    model = models.TriggerExpression
 
# 被关联表的配置,注意设置的inlines属性为上面的类名
class TriggerAdmin(admin.ModelAdmin):
    list_display = ('name', 'severity', 'enable')
    inlines = [TriggerExpressionInline, ]

更详细的信息请参考:https://www.cnblogs.com/wupeiqi/articles/7444717.html

posted on   Treelight  阅读(266)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示