Django(7)Admin管理工具(二)

简介: Django(7)Admin管理工具(二)

(3)复杂模型


  • 管理页面可以处理更加复杂的数据模型,如外外键约束等,实例:
- 修改models.py文件,创建三个表,一个表使用外键约束
# -*- coding: utf-8 -*-
from django.db import models
class Aaa(models.Model):
    name = models.CharField(max_length=20)
    age = models.CharField(max_length=3)
class Bbb(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField(default=0)
    def __unicode__(self):
        return self.name
class Tag(models.Model):
    contact = models.ForeignKey(Bbb,on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
    def __unicode__(self):
        return self.name

其中models.ForeignKey(Bbb,on_delete=models.CASCADE),表示外键关联,其中models.CASCADE表示在关联数据表字段做出操作时,自身表做的操作


  • CASCADE:默认选项,表示级联删除
  • PROTECT:保护模式,使用该选项,在删除时,会抛出ProtectedError的错误
  • SET_NULL:置空模式,删除时,外键字段被设置为空,前提是blank=True、null=True,定义该字段时,需要外键允许为空
  • SET_DEFAULT:删除时,外键字段设置为默认值,使用该选项时,需要注意外键的上一个默认值
  • SET( ):括号里可以是函数,设置自定义的值
  • DO_NOTHING:什么也不做


对操作进行记录,对模型进行修改


(test) PS F:\django\helloworld> python manage.py makemigrations TestModel
Migrations for 'TestModel':
  TestModel\migrations\0002_bbb_tag.py
    - Create model Bbb
    - Create model Tag
(test) PS F:\django\helloworld> python manage.py migrate TestModel
Operations to perform:
  Apply all migrations: TestModel
Running migrations:
  Applying TestModel.0002_bbb_tag... OK
  • 查看数据库,发现成功创建
mysql> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| TestModel_aaa              |
| TestModel_bbb              |
| TestModel_tag              |
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
13 rows in set (0.00 sec)
mysql> show create table TestModel_bbb;
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                 |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TestModel_bbb | CREATE TABLE `TestModel_bbb` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table TestModel_tag;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table         | Create Table                                                                                                                                                                                                                                                                                                                                                                                                            |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TestModel_tag | CREATE TABLE `TestModel_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `contact_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `TestModel_tag_contact_id_05dff71d_fk_TestModel_bbb_id` (`contact_id`),
  CONSTRAINT `TestModel_tag_contact_id_05dff71d_fk_TestModel_bbb_id` FOREIGN KEY (`contact_id`) REFERENCES `TestModel_bbb` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 修改TestModel/admin.py文件,注册数据模型
from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag  #导入所有数据模型
# Register your models here.
admin.site.register([Aaa,Bbb,Tag])

启动django,查看Admin管理平台,发现注册成功


073b1c21a3274a2eb77d22c1d388b693.png


(4)自定义表单


  • 可以自定义管理页面,来取代默认的页面,例如:
- 修改TestModel/admin.py文件
from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
# Register your models here.
class BbbAdmin(admin.ModelAdmin):
    fields = ('name',)   #只显示name,注意这里是元组,单个参数后需要加逗号
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa,Tag])

以上代码定义了BbbAdmin类,里面的fields属性定义了要显示的字段,通过admin.site.register(Bbb,BbbAdmin),第一个参数是模型中的数据表名称,第二个参数是指定此模型使用的显示格式


现在来看Admin管理平台,依次点击Bbbs—>增加BBB,可以看到只显示name字段


7836fb18b1b7429c9ca466f59f43e686.png

0ce2b8602921400c9ce35a8ea4714f4d.png

  • 现在还可以查看Tags数据表,还是进行创建数据,发现可以选择Bbb表的数据


77af45b42cbc44118adfe21b5be77537.png

  • 上面只是配置显示参数,除了这个还可以设置自定义格式,例如:
- 修改TestModel/admin.py文件
from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
# Register your models here.
class BbbAdmin(admin.ModelAdmin):
    fieldsets = (
        ['Main',{
            'fields': ('name',), #显示name
        }],
        ['Advance',{ 
            'classes': ('collapse',),  #CSS
            'fields': ('age',),  #隐藏age
        }]
    )
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa,Tag])


再次访问管理页面,点击刚才创建的数据,可以看到只有name,但是有一个Advance,可以点击显示

619daf41c48b4515a549f22c4f2ded34.png

71c04daff2af4b6eb81dad7b2f93fe66.png


(5)内联(lnline)显示


上面中的Bbb数据表,就是Tag数据表的外键,而在默认的页面中,会将两者分开,无法体现出两者的从属关系


根据上述问题,可以使用内联显示,让Tag数据表附加在Bbb的编辑页面上显示,实例:

- 修改TestModel/admin.py文件
from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag  #指定数据表
class BbbAdmin(admin.ModelAdmin):
    inlines = [TagInline]  #指定TagInline类
    fieldsets = (
        ['Main',{
            'fields': ('name',),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
    )
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa])
  • 访问进行测试


625ba71cf6cb429c9e01cbad2fa6ca20.png

16a03fa7c731425b96b531336aaeac7e.png


afb4ab63f5af498b8443173de2a16a2b.png

(6)修改数据表显示


  • 现在Bbb增加三条数据,可以看到只会这样显示


4e2741cf40764707b72f442fc9e7c43b.png

可以自定义此页面,使之变得更加可视化,例如:

from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag
class BbbAdmin(admin.ModelAdmin):
    list_display = ('name','age')  #显示name和age字段
    inlines = [TagInline]
    fieldsets = (
        ['Main',{
            'fields': ('name',),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
    )
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa])
  • 刷新页面,可以发现能够直接看到字段值

513ac55b47c348ef9e172f862833da6e.png

(7)增加搜索功能


  • 在数据量增多时,如果想要搜索指定数据,一个一个找肯定是不现实的,可以添加搜索功能,例如:


from django.contrib import admin
from TestModel.models import Aaa,Bbb,Tag
# Register your models here.
class TagInline(admin.TabularInline):
    model = Tag
class BbbAdmin(admin.ModelAdmin):
    list_display = ('name','age')
    search_fields = ('name',)  #添加搜索功能,搜索参数为name
    inlines = [TagInline]
    fieldsets = (
        ['Main',{
            'fields': ('name',),
        }],
        ['Advance',{
            'classes': ('collapse',),
            'fields': ('age',),
        }]
    )
admin.site.register(Bbb,BbbAdmin)
admin.site.register([Aaa])
  • 访问测试

cadaa3b7c97e4b33b3f363ff0c52d435.png

607ed0c692cd425e8af7d9916ecdc8fa.png


目录
相关文章
|
5月前
|
数据管理 数据库 数据安全/隐私保护
Django——Auth模块以及admin站点
Django——Auth模块以及admin站点
|
6月前
|
Python
百度搜索:蓝易云【Django自带的Admin后台中如何获取当前登录用户】
在上面的代码中,`@staff_member_required`装饰器确保只有管理员可以访问 `my_custom_view`视图,而 `@login_required`装饰器确保只有登录的用户可以访问该视图。然后,可以使用 `request.user.username`获取当前登录用户的用户名,并将其传递到模板中进行显示或其他操作。
57 3
|
6月前
|
人工智能 开发工具 数据库
Django实践-03模型-02基于admin管理表
Django实践-03模型-02基于admin管理表
Django实践-03模型-02基于admin管理表
|
数据安全/隐私保护 Python
27 Django高级- Admin站点
27 Django高级- Admin站点
57 0
|
Linux Python
django -- admin里的配置
django -- admin里的配置
|
数据库 数据安全/隐私保护 Python
08-Django-基础篇-admin管理后台
08-Django-基础篇-admin管理后台
|
XML 关系型数据库 MySQL
【Django】当大型项目采用Django框架对于QueryDict以及模板的表单在Admin 管理工具的使用
【Django】当大型项目采用Django框架对于QueryDict以及模板的表单在Admin 管理工具的使用
165 0
【Django】当大型项目采用Django框架对于QueryDict以及模板的表单在Admin 管理工具的使用
|
关系型数据库 MySQL 项目管理
Django(7)Admin管理工具(一)
Django(7)Admin管理工具(一)
205 0
Django(7)Admin管理工具(一)
|
中间件 数据库 Python
【Django知识补充 - 1】:admin站点和rest_framework实现文件的上传和下载
【Django知识补充 - 1】:admin站点和rest_framework实现文件的上传和下载
300 0
【Django知识补充 - 1】:admin站点和rest_framework实现文件的上传和下载
|
Python
【Django学习笔记 - 15】:admin站点编辑(关联对象在列表页中添加,编辑页调整、图片设置)2
【Django学习笔记 - 15】:admin站点编辑(关联对象在列表页中添加,编辑页调整、图片设置)
101 0
【Django学习笔记 - 15】:admin站点编辑(关联对象在列表页中添加,编辑页调整、图片设置)2