Djiang 5实用指南(八)后台管理系统
Django 自带了一个强大的后台管理系统,用于管理网站中的数据和模型。通过 Django 后台管理系统,开发者可以轻松地对模型数据进行增、删、改、查等操作,而无需编写大量的管理界面代码。Django5 继续优化并增强了后台管理功能,使得管理系统更加灵活和易用。
本章将详细介绍如何定制和扩展 Django5 的后台管理系统,包括如何配置模型管理、定制后台界面、使用内联表单和自定义管理命令等。
8.1 基础的后台管理配置
Django 的后台管理系统基于模型(Model)。为了在后台管理界面中管理模型数据,我们需要为每个模型定义一个 ModelAdmin 类,并在 admin.py 文件中注册该模型。
8.1.1 注册模型到后台管理系统
首先,定义一个模型并将其注册到 Django 的后台管理系统:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
def __str__(self):
return self.title
然后,在 admin.py 文件中注册该模型,使其出现在后台管理界面:
# admin.py
from django.contrib import admin
from .models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_date', 'price')
- @admin.register(Book):这是装饰器,告诉 Django 将 Book 模型注册到后台管理系统。
- list_display:指定在后台管理界面中显示的字段。它会显示模型中的哪些字段。
8.1.2 后台管理界面功能
Django 的后台管理界面为我们提供了许多内置功能,如排序、过滤和搜索。
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_date', 'price')
search_fields = ('title', 'author') # 搜索字段
list_filter = ('publish_date',) # 过滤器
ordering = ('publish_date',) # 默认排序
- search_fields:定义后台管理系统可以搜索的字段。
- list_filter:在后台界面中添加过滤器。
- ordering:设置后台显示数据的默认排序。
8.2 定制后台管理界面
Django 的后台管理系统提供了高度可定制的功能,可以定制模型显示、字段编辑、表单等。
8.2.1 修改模型表单
有时候,模型的字段需要通过定制表单来修改显示或验证。我们可以通过自定义表单类来定制后台界面的字段。
# forms.py
from django import forms
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'author', 'publish_date', 'price']
widgets = {
'publish_date': forms.SelectDateWidget(years=range(1990, 2025)),
}
# admin.py
from django.contrib import admin
from .models import Book
from .forms import BookForm
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
form = BookForm # 使用自定义表单
- widgets:我们在 BookForm 中为 publish_date 字段定制了一个日期选择小部件(SelectDateWidget)。
- form:在 BookAdmin 中使用 form 属性来指定使用自定义表单类。
8.2.2 自定义字段的显示
我们可以通过重写 ModelAdmin 的 get_form 方法来自定义字段的显示顺序和显示方式。
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_date', 'price')
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
# 自定义字段的顺序
form.base_fields['title'].widget.attrs.update({'class': 'custom-class'})
return form
在 get_form 中,我们可以通过修改表单字段的 widget 属性来定制字段的显示。
8.3 使用内联表单
内联表单允许在同一个页面上管理相关模型的多个实例。例如,我们可以将图书与其评论模型关联,允许在图书管理界面内嵌评论表单。
8.3.1 创建内联模型
首先,定义评论模型并创建关联:
# models.py
class Comment(models.Model):
book = models.ForeignKey(Book, related_name='comments', on_delete=models.CASCADE)
text = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
然后,创建一个内联模型类,将评论嵌套在图书模型下:
# admin.py
from django.contrib import admin
from .models import Book, Comment
class CommentInline(admin.TabularInline):
model = Comment
extra = 1 # 默认显示一个空白表单
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'publish_date', 'price')
inlines = [CommentInline] # 添加评论内联表单
- CommentInline:admin.TabularInline 表示我们希望以表格形式显示内联表单,extra 表示默认显示的空表单数量。
8.3.2 配置内联表单
可以进一步定制内联表单的字段和样式。例如,可以通过 fields 来指定内联表单显示的字段。
class CommentInline(admin.TabularInline):
model = Comment
fields = ('text', 'created_at')
extra = 1
8.4 自定义管理命令
Django 后台系统不仅支持模型的管理,还可以自定义命令来执行后台任务。Django 提供了 django.core.management.BaseCommand 类用于创建自定义管理命令。
8.4.1 创建自定义管理命令
# management/commands/cleanup_books.py
from django.core.management.base import BaseCommand
from myapp.models import Book
class Command(BaseCommand):
help = 'Cleanup old books'
def handle(self, *args, **kwargs):
books = Book.objects.filter(publish_date__lt='2000-01-01')
books.delete()
self.stdout.write(self.style.SUCCESS('Successfully deleted old books'))
在这个命令中,我们删除了所有出版日期早于 2000 年的书籍。
8.4.2 使用自定义管理命令
在终端中运行以下命令:
python manage.py cleanup_books
这会执行自定义的 cleanup_books 命令,删除数据库中所有早于 2000 年出版的书籍。
小结
本章介绍了 Django5 后台管理系统的核心功能,包括如何注册和定制模型管理界面、使用内联表单以及创建自定义管理命令。通过强大的后台管理系统,Django 极大地简化了模型数据的管理过程,开发者可以通过少量的配置和定制,快速创建出符合需求的后台管理系统。
使用 Django 后台管理系统的关键是理解 ModelAdmin 类的各项配置项,以及如何定制表单、显示、内联和命令等功能。掌握这些技巧,可以大大提升后台管理系统的灵活性和可维护性。