一个项目有端的概念,例如商城系统,用户看到的是用户端,公司有自己的后台端口,商家的端口

后台管理介绍

Django中默认集成了后台数据管理页面,通过简单的配置就可以实现模型后台的Web控制台。
管理界面通常是给系统管理员使用的,用来完成数据的输入,删除,查询等工作。
如果没有集成可在settings中的INSTALLED_APPS中添加django.contrib.admin

默认在url后加admin界面就可进入django自带的管理登录界面:


创建管理员账号

django提供了终端快速创建管理员账号的命令

创建账号的命令:

python manage.py createsuperuser

结果如下:

(venv) E:\djstudy\day15\RESTend>python manage.py createsuperuser
Username (leave blank to use 'justin'): peiqi
Email address: peiqi@qq.com
Password:
Password (again):
Superuser created successfully.

后台管理功能

登录刚刚注册的账号

如果需要改成中文,改动settings.py中下面的配置;

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

点击task results:

可以看到之前celery异步任务详情,并且可以修改/删除/新建任务,其他的模型也可以进行类似这样的操作。

添加自己的模型到管理界面

django内置的模型有:用户、组。

如果要管理自己的模型,使用admin.site.register()在项目的admin.py中注册一下对应的模型即可。

from django.contrib import admin

from App.models import UserModel, Address

admin.site.register(UserModel)
admin.site.register(Address)

查看管理界面:


点击User models查看详情

可以看到这里只显示UserModel object,而不是显示的具体的名字。

管理列表显示具体信息

可以重写model.py中的UserModel模型中的__str__方法:

from django.db import models

class UserModel(models.Model):

    u_name = models.CharField(max_length=16,unique=True)
    u_password = models.CharField(max_length=256)
    
    def __str__(self):
        return self.u_name


class Address(models.Model):
    a_address = models.CharField(max_length=128)
    a_user = models.ForeignKey(UserModel, related_name='address_list',on_delete=models.CASCADE,null=True,blank=True)
    
    def __str__(self):
        return self.a_address

观察页面:

成功。

个性化后台管理

如果感觉默认的站点样式不能满足应用需求,则开发者可以通过继承Django定义的管理员数据模型,模板,站点类来开发出个性化的管理员站点。

在admin.py中先创建自己的管理类(该管理类要继承系统的管理类),然后添加自己的管理类。

创建并添加管理类

创建管理类模板

class UserAdmin(admin.ModelAdmin):
    # 规则

个性化规则

显示规则:

  • list_display 显示字段
  • list_filter 过滤字段
  • search_fields 搜索字段
  • list_per_page 分页,每页显示多少条数据,默认每页20条
  • ordering 排序规则
  • 分组显示

    • fields=(('班级',{'fields':('sgrade')}),('姓名',{'fields':('sname')}))

修改规则

  • fields 显示的字段
  • exclude 不显示的字段

显示、过滤、分页器

from django.contrib import admin

from App.models import UserModel, Address


class UserAdmin(admin.ModelAdmin):
    list_display = 'u_name', 'u_password'  # 显示字段
    search_fields = ['u_name'] # 搜索字段
    list_filter = ['u_name']  # 过滤字段
    list_per_page = 5


admin.site.register(UserModel, UserAdmin)  # 添加自己的管理类
admin.site.register(Address)
  • 6-10行创建自定义管理类
  • 13行添加管理类

页面显示:


布尔值定制显示,列属性名称修改

之前的模型太简单,现在在sendemail中创建新的模型:

from django.db import models

class Grade(models.Model):
    g_name= models.CharField(max_length=16)
    g_position = models.CharField(max_length=20)

class Student(models.Model):
    s_name = models.CharField(max_length=32)
    s_age = models.IntegerField(default=8)
    s_sex = models.BooleanField(default=False)
    s_height = models.FloatField(default=1)
    s_weight = models.FloatField(default=1)
    s_grade = models.ForeignKey(Grade, on_delete=models.CASCADE)

迁移数据库。

sendemail中的admin.py:

from django.contrib import admin

from sendemail.models import Grade, Student

class GradeAdmin(admin.ModelAdmin):
    list_display = ['g_name','g_position']

class StudentAdmin(admin.ModelAdmin):
    list_display = ['s_name', 's_age', 's_sex']

admin.site.register(Grade,GradeAdmin)
admin.site.register(Student,StudentAdmin)

访问页面:

可以看到性别只显示了布尔值,可以在list_display的时候传递一个函数:

from django.contrib import admin

from sendemail.models import Grade, Student

class GradeAdmin(admin.ModelAdmin):
    list_display = ['g_name','g_position']

admin.site.register(Grade,GradeAdmin)

class StudentAdmin(admin.ModelAdmin):
    def sex(self):
        if self.s_sex:
            return '女'
        else:
            return '男'
    sex.short_description = '性别'  # 修改列属性名称
    list_display = ['s_name', 's_age', sex]

admin.site.register(Student,StudentAdmin)
  • 11-15行传递了一个函数,根据布尔值返回性别名称。
  • 16行修改列属性名称

页面浏览:


分组显示

修改具体信息时,可以将信息划分为不同类别
原始修改Student页面:

添加分组现实:

class StudentAdmin(admin.ModelAdmin):
    def sex(self):
        if self.s_sex:
            return '女'
        else:
            return '男'
    sex.short_description = '性别'  # 列属性名称修改
    list_display = ['s_name', 's_age', sex]

    # 分组显示
    fieldsets = (
        ('基本信息',{'fields':('s_name','s_age','s_sex')}),
        ('可选信息',{'fields':('s_height','s_weight')}),
    )


admin.site.register(Student,StudentAdmin)
  • 10-13行分组显示



后台级联插入数据

例如添加班级时,同时插入两个学生。

admin.py:

class StudentInfo(admin.TabularInline):
    extra = 3  # 插入班级时,需要级联数据的数量,也就是需要填写学生信息的数量
    model = Student  # 绑定Student模型

class GradeAdmin(admin.ModelAdmin):
    list_display = ['g_name','g_position']
    inlines = [StudentInfo]  # 使用inlines,后面填写级联的类名
  • 使用inlines级联对应的类

测试:
在创建新的grade的时候,会要求填入3个学生信息

以上就是入门使用,可以看到功能还是比较强大的,可以定制很多小细节。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏