Django Admin添加模型时限制ForeignKey为当前用户所属对象
解决Django Admin添加Post时仅显示当前用户Notebook的问题
实现步骤
1. 自定义Post的Admin类
在应用的admin.py文件中,为Post模型配置Admin类,通过重写formfield_for_foreignkey方法过滤Notebook的可选范围:
from django.contrib import admin from .models import Notebook, Post class PostAdmin(admin.ModelAdmin): def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "notebook": # 仅展示当前登录用户拥有的Notebook kwargs["queryset"] = Notebook.objects.filter(user=request.user) return super().formfield_for_foreignkey(db_field, request, **kwargs) admin.site.register(Notebook) admin.site.register(Post, PostAdmin)
2. 优化:自动填充Post的user字段
由于Post的user字段必然是当前登录用户,可以自动填充该字段,避免手动选择:
class PostAdmin(admin.ModelAdmin): # 从表单中隐藏user字段 exclude = ("user",) def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "notebook": kwargs["queryset"] = Notebook.objects.filter(user=request.user) return super().formfield_for_foreignkey(db_field, request, **kwargs) # 保存时自动设置user为当前登录用户 def save_model(self, request, obj, form, change): if not change: # 仅新增记录时执行 obj.user = request.user obj.save()
3. 针对超级管理员的特殊处理(可选)
如果需要让超级管理员能看到所有Notebook,可在过滤逻辑中加入权限判断:
def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "notebook": if request.user.is_superuser: kwargs["queryset"] = Notebook.objects.all() else: kwargs["queryset"] = Notebook.objects.filter(user=request.user) return super().formfield_for_foreignkey(db_field, request, **kwargs)
内容的提问来源于stack exchange,提问作者Doug Smith
相关产品推荐
相关产品推荐

