下面展示了如何通过自定义的 ModelAdmin 类来优化 Django 后台管理界面。
假设 ProjectNode 模型在 models.py 文件中如下定义:
# models.py
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class ProjectNode(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='nodes')
node_name = models.CharField(max_length=100)
node_start_date = models.DateField()
node_end_date = models.DateField()
manager = models.CharField(max_length=100)
report_issue = models.TextField(blank=True)
def __str__(self):
return f"{self.project.name} - {self.node_name}"
接下来,在 admin.py 文件中定义一个自定义的 ModelAdmin 类:
# admin.py
from django.contrib import admin
from .models import ProjectNode
class ProjectNodeAdmin(admin.ModelAdmin):
# 在列表页面中显示的字段
list_display = ('project', 'node_name', 'node_start_date', 'node_end_date', 'manager')
# 侧边栏的筛选器
list_filter = ('project', 'manager', 'node_start_date')
# 搜索框
search_fields = ('node_name', 'manager')
# 每页显示的条目数
list_per_page = 20
# 默认排序方式
ordering = ('-node_start_date',)
# 自定义表单字段的显示格式
fieldsets = (
(None, {
'fields': ('project', 'node_name', 'node_start_date', 'node_end_date', 'manager', 'report_issue')
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('node_start_date', 'node_end_date'),
}),
)
# 可选:在表单中显示某些只读字段
readonly_fields = ('project',)
# 可选:自定义表单字段的布局
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
# 可以在这里进一步自定义表单,例如:动态设置字段
return form
# 注册模型及其自定义的 ModelAdmin
admin.site.register(ProjectNode, ProjectNodeAdmin)
代码解释
-
list_display: 指定在后台列表视图中显示哪些字段。这有助于快速查看每个ProjectNode实例的关键信息。 -
list_filter: 在后台的侧边栏中添加筛选器,能够根据project、manager或node_start_date进行筛选。 -
search_fields: 添加搜索框,使你可以根据node_name或manager在后台进行搜索,帮助快速找到特定的节点。 -
list_per_page: 设置每页显示的条目数为 20 条,防止在页面上显示过多数据。 -
ordering: 定义默认的排序方式,这里是按node_start_date降序排序,将最近开始的节点排在前面。 -
fieldsets: 定义表单中字段的布局,None部分包含了基本字段,而Advanced options部分可以折叠,以组织表单中的字段。 -
readonly_fields: 指定某些字段为只读,这里将project设置为只读,防止在编辑时修改项目字段。 -
get_form: 可选方法,用于进一步自定义表单字段的显示或其他属性。这对动态调整表单的行为很有用。