Django Admin创建Post时Author字段仅显示当前用户的实现方法
解决方案
要实现非超级用户作者在后台添加Post时,Author字段仅显示当前登录用户的需求,你可以通过重写Django Admin的几个核心方法完成,具体实现如下:
1. 替换admin.py中的PostAdmin类
将原有的PostAdmin代码替换为以下内容:
from django.contrib import admin from .models import Post class PostAdmin(admin.ModelAdmin): list_display = ('title', 'slug', 'status','created_on') list_filter = ("status",) search_fields = ['title', 'content'] prepopulated_fields = {'slug': ('title',)} def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser: return qs return qs.filter(author=request.user) def formfield_for_foreignkey(self, db_field, request, **kwargs): # 限制非超级用户的Author字段可选范围仅为当前用户 if db_field.name == "author" and not request.user.is_superuser: kwargs["queryset"] = request.user._meta.model.objects.filter(id=request.user.id) return super().formfield_for_foreignkey(db_field, request, **kwargs) def get_form(self, request, obj=None, **kwargs): form = super().get_form(request, obj, **kwargs) # 新建Post时自动填充当前用户为作者 if not obj and not request.user.is_superuser: form.base_fields['author'].initial = request.user return form def get_readonly_fields(self, request, obj=None): # 非超级用户无法修改作者字段 readonly_fields = super().get_readonly_fields(request, obj) if not request.user.is_superuser: return readonly_fields + ('author',) return readonly_fields
2. 代码功能说明
formfield_for_foreignkey:针对author外键字段,当登录用户不是超级用户时,将可选的用户列表过滤为仅当前登录用户,添加Post时下拉框只会显示自己。get_form:在创建新Post(无现有对象obj=None)且用户非超级用户时,自动将author字段的初始值设置为当前登录用户,无需手动选择。get_readonly_fields:让非超级用户在添加或修改Post时,author字段变为只读状态,防止意外修改作者信息。- 保留原有
get_queryset:维持非超级用户仅能查看自己创建的Post的逻辑。
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

