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

Django如何将request.user参数传递给modelformset_factory关联的自定义表单

错误原因

你传入modelformset_factory的form参数要求接收表单类本身,而你写的SquadForm(request.user)是已经完成实例化的表单对象,参数类型不匹配,所以触发了报错。

修复步骤

1. 调整forms.py的参数接收逻辑

先从初始化的关键字参数中弹出自定义参数,避免父类初始化时识别不到额外参数报错,同时删除你原来冗余的user位置参数:

class SquadForm(ModelForm):     
    class Meta:
        model = Squad    

    def __init__(self, *args, **kwargs):
        # 弹出自定义参数,不要传给父类
        logged_user = kwargs.pop('logged_user')
        super(SquadForm, self).__init__(*args, **kwargs)
        self.fields['team'] = forms.ModelChoiceField(
            queryset=Team.rows.get_my_teams(user=logged_user), 
            empty_label="None"
        )

2. 调整views.py的传参逻辑

实例化formset时通过Django内置的form_kwargs参数,将登录用户传递给每个子表单的初始化方法:

def choose_teams(request):      
    # form参数只传表单类,不要提前实例化
    teamformset = modelformset_factory(Squad, extra=2, form=SquadForm)
    # 用form_kwargs传递自定义参数给所有子表单
    form = teamformset(
        queryset=Squad.objects.none(),
        form_kwargs={'logged_user': request.user}
    )
    return render(request, 'foo.html', {'form':form})

修改完成后,每个表单实例的team字段都会按照当前登录用户过滤可选选项,不会再出现全局展示所有数据的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:04