自定义 `ModelAdmin` 类来优化 Django 后台管理界面。

59 阅读2分钟

下面展示了如何通过自定义的 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: 在后台的侧边栏中添加筛选器,能够根据 projectmanagernode_start_date 进行筛选。

  • search_fields: 添加搜索框,使你可以根据 node_namemanager 在后台进行搜索,帮助快速找到特定的节点。

  • list_per_page: 设置每页显示的条目数为 20 条,防止在页面上显示过多数据。

  • ordering: 定义默认的排序方式,这里是按 node_start_date 降序排序,将最近开始的节点排在前面。

  • fieldsets: 定义表单中字段的布局,None 部分包含了基本字段,而 Advanced options 部分可以折叠,以组织表单中的字段。

  • readonly_fields: 指定某些字段为只读,这里将 project 设置为只读,防止在编辑时修改项目字段。

  • get_form: 可选方法,用于进一步自定义表单字段的显示或其他属性。这对动态调整表单的行为很有用。