Skip to content

Django 后台管理系统

Django 默认提供了一个后台管理系统的应用模块

可用于对各个自定义应用中 模型 ( Model ) 对应的数据进行可视化管理

前提配置

注册应用

1. 已经默认将管理系统注册到了主应用

Django 默认已经注册并使用了该内置管理系统

py
INSTALLED_APPS = [                                             
    # Django 内置应用
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    # 其他第三方包
    # ...
    # 其他自定义应用
    # ...
]                                                              
2. 已经默认在主应用路由中定义了访问路径/admin与管理页面的映射关系
py
from django.contrib import admin                    
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    # 其他自定义的路由映射
    # ...
]                                                   
3. 只需要在启动 Django 项目之前将默认生成的迁移内容映射到数据库

主要是将 Django 内置模块adminauthcontenttypessessions进行数据迁移

zsh
(虚拟环境) % cd [项目名]                                           
(虚拟环境) % python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

管理员用户

管理系统需要通过一个超级管理员用户登陆

创建的管理用户会存储在数据库中的auth_user表中

zsh
(虚拟环境) % cd [项目名]
(虚拟环境) % python manage.py createsuperuser
Username:           [输入用户登录名]
Email address:      [输入用户邮箱地址]
Password:           [输入用户登录密码]
Password (again):   [输入用户登录密码]
Superuser created successfully.
zsh
(虚拟环境) % cd [项目名]
(虚拟环境) % export DJANGO_SUPERUSER_USERNAME=[用户登录名]
(虚拟环境) % export DJANGO_SUPERUSER_EMAIL=[用户邮箱地址]
(虚拟环境) % export DJANGO_SUPERUSER_PASSWORD=[用户登录密码]
(虚拟环境) % python manage.py createsuperuser --noinput
例子:用交互式创建一个管理用户
zsh
(虚拟环境) % python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: admin
Password (again): admin
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
例子:用脚本形式在 Docker Compose 中执行构建的容器时同时创建一个管理用户
yml
version: "3.8"

services:
  backend:
    image: backend:latest
    container_name: backend
    build:
      context: ./backend
      dockerfile: Dockerfile
    command: sh -c "
      python manage.py migrate &&
      export DJANGO_SUPERUSER_USERNAME=admin &&
      export DJANGO_SUPERUSER_EMAIL=admin@example.com &&
      export DJANGO_SUPERUSER_PASSWORD=admin &&
      python manage.py createsuperuser --noinput &&
      python manage.py runserver 0.0.0.0:8080
      "
    ports:
      - "8080:8080"
    depends_on:
      db:
        condition: service_healthy

  db:
    image: db:latest
    container_name: db
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: my_db
    volumes:
      - my_db:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d my_db"]
      interval: 5s
      timeout: 5s
      retries: 5
[项目目录]
├─ docker-compose.yml

└─ backend/
    ├─ Dockerfile
    └─ ...

注册模型

模型必须要提前注册到该应用目录下admin.py文件后才能在后台管理系统上进行可视化管理

并且要提前做好数据迁移将内容映射到数据库,否则管理页面会报错


所处位置

[项目目录]
├─ manage.py

├─ [主应用]/
│   └─ ...

└─ [自定义应用]/
    ├─ admin.py
    └─ ...

基础注册

模型类可通过方法admin.site.register()注册

py
from django.contrib import admin
from .models import 模型类1, 模型类2     

admin.site.register(模型类1)
admin.site.register(模型类2)
例子:将自定义应用中的两个模型注册到 Django Admin
py
from django.contrib import admin
from .models import Student, StudySubject

admin.site.register(Student)
admin.site.register(StudySubject)
py
from django.db import models


class Student(models.Model):
    # 省略 ...
    pass


class StudySubject(models.Model):
    # 省略 ...
    pass
demo_1
├─ manage.py
├─ ...

└─ xxxx/
    ├─ admin.py
    ├─ models.py
    └─ ...

自定义注册

模型类可以一个类的形式注册,并进行额外的自定义配置

py
from django.contrib import admin
from .models import 模型类1, 模型类2            


@admin.register(模型类1)
class 模型名Admin(admin.ModelAdmin):
    pass


@admin.register(模型类2)
class 模型名Admin(admin.ModelAdmin):
    配置属性 =
    配置属性 =
常用的配置属性说明
list_display设置模型数据一览页面上可显示的模型字段
比如:list_display = ("字段名1", "字段名2")
list_per_page设置模型数据一览页面上每页展示的数据个数
比如:list_per_page = 10
list_filter设置模型数据一览页面上的可过滤字段
比如:list_filter = ("字段名1", "字段名2")
ordering设置模型数据一览页面上的数据排序
比如:ordering = ("字段名1", "-字段名2")
search_fields设置模型数据一览页面上的可搜索的模型字段
比如:list_display = ("字段名1", "字段名2")
readonly_fields设置模型数据编辑页面上的只读字段
比如:readonly_fields = ("字段名1", "字段名2")
例子:将自定义应用中的一个模型注册到 Django Admin
py
from django.contrib import admin
from .models import Student


@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "score", "updated_at", "teacher")
    list_filter = ("name", "score")
    search_fields = list_display
    ordering = ("-score",)
    readonly_fields = ("updated_at",)
py
from django.db import models
from django.conf import settings


class Student(models.Model):
    name = models.CharField( verbose_name="学生姓名", max_length=36)
    score = models.FloatField(verbose_name="学生分数")
    updated_at = models.DateTimeField(verbose_name="更新时间", auto_now=True)
    teacher = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        null = True,
        verbose_name="担当老师",
    )

    class Meta:
        verbose_name = "学生信息"
        verbose_name_plural = verbose_name
        ordering = ("score",)

    def __str__(self):
        return f"{self.id}"
[项目目录]
├─ manage.py

├─ [主应用]/
│   └─ ...

└─ student/
    ├─ admin.py
    ├─ models.py
    └─ ...

数据的导入导出

CSV、EXCEL、JSON、YAML 文件的导入导出可以借助第三方库 django-import-export

1. 下载安装
zsh
% cd [项目名]
% source [虚拟环境]/bin/activate
(虚拟环境) % pip install django-import-export
2. 注册应用
py
INSTALLED_APPS = [
    # 其他应用
    # ...
    "import_export"
]