Django:模型注册到admin的方法
已于 2025年09月07日 15:45 修改
访问次数:0
Django Admin 注册方式对比表
| 写法 | 示例 | 特点 | 适用场景 |
|---|---|---|---|
方式一:admin.site.register | python<br>from django.contrib import admin<br>from .models import Book<br><br>admin.site.register(Book)<br> | - 最基础、最直观 - 直接把模型注册到 Admin - 如果需要自定义,可以传第二个参数 BookAdmin | - 小项目 / 快速测试 - 只需要默认管理界面 - 不需要额外配置 |
方式二:admin.site.register + 自定义 ModelAdmin | python<br>class BookAdmin(admin.ModelAdmin):<br> list_display = ('title', 'author')<br><br>admin.site.register(Book, BookAdmin)<br> | - 灵活性高 - 明确分离模型和管理配置 | - 中大型项目 - 需要为多个模型自定义不同的 Admin 配置 |
方式三:装饰器 @admin.register | python<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)