Django:模型注册到admin的方法

Django Admin 注册方式对比表


写法示例特点适用场景
方式一:admin.site.registerpython<br>from django.contrib import admin<br>from .models import Book<br><br>admin.site.register(Book)<br>- 最基础、最直观
- 直接把模型注册到 Admin
- 如果需要自定义,可以传第二个参数 BookAdmin
- 小项目 / 快速测试
- 只需要默认管理界面
- 不需要额外配置
方式二:admin.site.register + 自定义 ModelAdminpython<br>class BookAdmin(admin.ModelAdmin):<br> list_display = ('title', 'author')<br><br>admin.site.register(Book, BookAdmin)<br>- 灵活性高
- 明确分离模型和管理配置
- 中大型项目
- 需要为多个模型自定义不同的 Admin 配置
方式三:装饰器 @admin.registerpython<br>@admin.register(Book)<br>class BookAdmin(admin.ModelAdmin):<br> list_display = ('title', 'author')<br>- 语法简洁,模型与 Admin 配置放在一起
- 避免重复写 admin.site.register
- 推荐在模型不多时使用
- 适合写法简洁的代码风格



下面系统整理一下 admin.ModelAdmin 的使用方式,这是 Django Admin 自定义的核心。



1. 基本用法

在 Django Admin 中,ModelAdmin 是用来定义某个模型在后台的展示方式和操作规则的。

例子:

from django.contrib import admin
from .models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    pass

如果不写任何配置,后台就是默认的管理界面。下面我们通过配置参数一步步增强它。



2. 常用配置项

(1) 列表页配置

  • list_display 定义列表页显示哪些字段。 list_display = ('id', 'title', 'author', 'published_date')
  • list_display_links 哪些字段可以点进去进入编辑页面。 list_display_links = ('title',)
  • list_filter 右侧添加过滤器。 list_filter = ('author', 'published_date')
  • search_fields 搜索框支持的字段。 search_fields = ('title', 'author__name') # 支持外键查找
  • ordering 默认排序规则。 ordering = ('-published_date',)
  • date_hierarchy 顶部生成日期导航。 date_hierarchy = 'published_date'


(2) 编辑页配置

  • fields 控制编辑页面字段的顺序。 fields = ('title', 'author', 'published_date')
  • exclude 排除不显示的字段。 exclude = ('created_at', 'updated_at')
  • readonly_fields 设置只读字段。 readonly_fields = ('created_at',)
  • fieldsets 把字段分组,页面更清晰。 fieldsets = ( ('基本信息', { 'fields': ('title', 'author') }), ('出版信息', { 'fields': ('published_date', 'isbn'), 'classes': ('collapse',), # 可折叠 }), )


(3) 内联编辑(Inline)

在一个模型的编辑页面里直接管理另一个关联模型。

class ChapterInline(admin.TabularInline):  # 或者 StackedInline
    model = Chapter
    extra = 1   # 默认显示 1 个空行

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    inlines = [ChapterInline]

这样在编辑 Book 时,可以直接在页面里添加/编辑 Chapter



(4) 动作(Actions)

批量操作。

@admin.action(description='标记为已发布')
def make_published(modeladmin, request, queryset):
    queryset.update(status='published')

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    actions = [make_published]

后台列表页面就会多一个“标记为已发布”的批量操作。



(5) 权限控制

  • has_add_permission(self, request)
  • has_change_permission(self, request, obj=None)
  • has_delete_permission(self, request, obj=None)
  • has_view_permission(self, request, obj=None)

可以根据 request.user 判断是否允许。



(6) 自定义显示字段

你可以在 list_display 中调用方法:

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'is_recent')

    def is_recent(self, obj):
        return obj.published_date.year >= 2020
    is_recent.boolean = True  # 显示小图标
    is_recent.short_description = '是否近期出版'


3. 高级用法

(1) 自定义表单

from django import forms

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = '__all__'

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    form = BookForm

(2) 重写查询集

限制后台能看到的数据范围:

def get_queryset(self, request):
    qs = super().get_queryset(request)
    if request.user.is_superuser:
        return qs
    return qs.filter(author=request.user)

(3) 自定义保存逻辑

def save_model(self, request, obj, form, change):
    if not change:  # 新建时
        obj.created_by = request.user
    obj.save()


4. 总结

  • 简单注册 → admin.site.register(Model)
  • 自定义展示/编辑 → 继承 admin.ModelAdmin
  • 复杂业务逻辑 → 重写方法 / 自定义表单 / 内联模型


文章标签:

评论(0)