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
相关产品推荐
相关产品推荐

