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

如何在Django Admin的TabularInline中获取request.user?

Django Admin内联组件ModelForm获取当前用户的方法

你之前给formset绑定user的方式无效,因为form实例化时,formset不会自动把这个user传入到单个form的kwargs中,所以会触发KeyError。下面是两种可行的解决办法:

方法一:重写Inline的get_form_kwargs传递用户

直接在Inline类中重写get_form_kwargs方法,把当前请求的用户注入到form的参数里:

class ResourceTabularInline(TabularInline):
    model = Resource
    form = ResourceForm
    
    def get_form_kwargs(self, request, obj=None, **kwargs):
        kwargs = super().get_form_kwargs(request, obj, **kwargs)
        # 将当前用户传入form的kwargs
        kwargs['user'] = request.user
        return kwargs

这样你的ResourceForm的__init__方法就能正常通过kwargs.pop("user")拿到用户,clean方法里直接使用self.user即可。

方法二:通过重写Formset传递用户

如果需要在formset层面做额外处理,可以自定义formset类,在构造单个form时传入用户:

class ResourceTabularInline(TabularInline):
    model = Resource
    form = ResourceForm
    
    def get_formset(self, request, obj=None, **kwargs):
        base_formset = super().get_formset(request, obj, **kwargs)
        
        class UserAwareFormset(base_formset):
            def __init__(self, *args, **kwargs):
                self.user = request.user
                super().__init__(*args, **kwargs)
            
            def _construct_form(self, i, **kwargs):
                # 给每个form的参数添加user
                kwargs['user'] = self.user
                return super()._construct_form(i, **kwargs)
        
        return UserAwareFormset

这种方式同样能让ResourceForm获取到用户信息,逻辑和方法一一致,只是实现层面不同。

内容的提问来源于stack exchange,提问作者xtlc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:42:35