You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:30:51