Django Model Admin如何设置仅展示当前登录用户而非全部用户
Django Model Admin外键下拉框用户范围过滤实现方案
问题根源
你当前仅通过get_queryset限制了可查询的数据范围,该方法不会影响表单字段的可选选项集合,因此编辑页的用户下拉框仍会展示全部用户。
实现方法
在你现有的Museum_ItemAdmin类中新增formfield_for_foreignkey方法,专门定制user外键字段的查询集即可:
from django.contrib.auth.models import User # 确保你已经导入User模型 class Museum_ItemAdmin(admin.ModelAdmin): # 你现有的get_queryset方法保留 def get_queryset(self, request): qs = super(Museum_ItemAdmin, self).get_queryset(request) if request.user.is_superuser: return qs return qs.filter(user=request.user) # 新增如下方法过滤用户下拉框选项 def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == "user" and not request.user.is_superuser: # 仅将当前登录用户加入可选范围 kwargs["queryset"] = User.objects.filter(id=request.user.id) return super().formfield_for_foreignkey(db_field, request, **kwargs)
可选安全加固(推荐)
如果普通用户无需修改关联的用户信息,可以直接将user字段设为普通用户的只读字段,彻底避免关联关系被篡改:
class Museum_ItemAdmin(admin.ModelAdmin): # 前面的get_queryset、formfield_for_foreignkey方法保留 def get_readonly_fields(self, request, obj=None): # 非超级用户场景下将user加入只读字段 if not request.user.is_superuser: return self.readonly_fields + ('user',) return self.readonly_fields
内容的提问来源于stack exchange,提问作者Avgoustis Avgousti
相关产品推荐
相关产品推荐

