用 Django Admin 管理内容
学习目标
把分类和文章接入后台,配置列表列、搜索、筛选和自动补全,知道 staff、模型权限和对象范围是三层不同的限制。
为什么先用 Admin
Admin 能让你在尚未编写前台编辑页面时管理数据,尤其适合内部运营。它不是普通用户的个人中心:普通用户后面使用专门的写作页面,后台只给可信编辑。本站已经使用 Unfold 定制 Admin,练习先使用 Django 原生后台,学会配置后再选择主题。
分类搜索支持文章表单中的自动补全。文章列表一次加载作者和分类,避免逐条查询。作者为只读字段,新建时由服务端填写当前管理员;普通编辑只能查询自己的文章,超级用户可管理全部。隐藏页面按钮不等于限制权限,服务端查询范围必须配合设置。
具体怎么做
- 确保第 10 章已创建超级用户,新增
blog/admin.py。 - 打开
http://127.0.0.1:8000/admin/,用自己的超级用户登录。 - 创建分类时名称填“Python”,slug 填
python。中文名称的自动 slug 不保证有可用结果,要检查该字段。 - 添加一篇草稿,再改为已发布;搜索标题,按状态筛选,观察列表列是否清晰。
- 在后台建立一个非超级编辑用户,仅启用 staff,并给与 blog 文章查看、添加、修改权限。退出超级用户再登录验证对象范围。不要给这个编辑修改用户权限的权限。
本章新增或替换的完整文件
以下路径均相对于练习项目根目录。替换同名文件的全部内容;未列出的文件保持上一章版本。
blog/admin.py
from django.contrib import admin
from .models import Category, Post
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ("name", "slug")
search_fields = ("name",)
prepopulated_fields = {"slug": ("name",)}
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
# 前台详情路由在第 13 章实现,此阶段不显示“查看站点”链接。
view_on_site = False
list_display = ("title", "author", "category", "status", "created_at")
list_filter = ("status", "category")
search_fields = ("title", "body", "author__username")
autocomplete_fields = ("category",)
list_select_related = ("author", "category")
readonly_fields = ("author", "created_at", "updated_at")
def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset if request.user.is_superuser else queryset.filter(author=request.user)
def save_model(self, request, obj, form, change):
if not change:
obj.author = request.user
super().save_model(request, obj, form, change)
如何确认成功
后台能看到分类和文章,分类输入框可以搜索名称。使用受限编辑时,只能看到自己的文章;直接输入其他作者的编辑地址,也不能读取或修改对方记录。仅设置 staff 而未分配模型权限的账号不能管理文章,这是预期行为。
练习:为编辑角色建立一个组,把需要的模型权限授予组,再将用户加入组。解释“用户可以登录后台”“用户能修改 Post”“用户只能修改自己的 Post”分别由哪些机制控制。
常见问题
autocomplete_fields 报错? 关联模型的 ModelAdmin 必须提供 search_fields,并注册在同一个 Admin 站点。readonly_fields 是否阻止所有数据库修改? 它只影响后台表单展示;业务层、API 和数据库仍需要各自保护。为何不让作者自动补全选择任意用户? 练习站的文章作者应来自当前身份;本站运营需要代作者发布时,可以使用经过授权的作者选择功能,但不能把该能力开放给所有用户。
官方参考
登录后可保存阅读位置、标记章节完成,并在其他设备继续学习。
登录并保存学习进度 →联系站长
微信:VIPdjango。技术问题建议先在 社区讨论 中交流,方便更多人参与和查阅。
章节讨论 0