所以我有一个与模型绑定(bind)的表单集,其中的字段之一是 ForeignKey
。
models.py
class Squad(models.Model):
rid = models.AutoField(primary_key=True)
team = models.ForeignKey(Team, on_delete=models.CASCADE)
def __str__(self):
return self.team.tname
forms.py
class SquadForm(ModelForm):
class Meta:
model = Squad
def __init__(self, logged_user, user, *args, **kwargs):
super(SquadForm, self).__init__(*args, **kwargs)
self.fields['team'] = forms.ModelChoiceField(queryset=Team.rows.get_my_teams(user=logged_user), empty_label="None")
如您所见,__init__
函数需要一个额外的参数logged_user
,我希望通过views.py 文件传递该参数。但如果我执行以下操作:
views.py
def choose_teams(request):
teamformset = modelformset_factory(Squad, extra=2, form=SquadForm(request.user))
form = teamformset(queryset=Squad.objects.none())
return render(request, 'foo.html', {'form':form})
我尝试将登录用户作为第 2 行的参数传递,但这会导致以下消息:
Field 'id' expected a number but got 'SquadForm'
不确定我在这里缺少什么。但如果我从第 2 行删除参数:
teamformset = modelformset_factory(Squad, extra=series.team_number, form=SquadForm)
它开始工作(当然,我不再期望 forms.py 文件中的用户并将其也删除),但显示所有数据而不是过滤数据。
最佳答案
您可以通过传递 form_kwargs={} 将其他关键字参数传递到表单集表单。到您的表单集
class SquadForm(ModelForm):
class Meta:
model = Squad
def __init__(self, *args, logged_user, **kwargs):
super(SquadForm, self).__init__(*args, **kwargs)
self.fields['team'] = forms.ModelChoiceField(queryset=Team.rows.get_my_teams(user=logged_user), empty_label="None")
teamformset = modelformset_factory(Squad, extra=2, form=SquadForm)
form = teamformset(queryset=Squad.objects.none(), form_kwargs={'logged_user': request.user})
关于python - 将 request.user 参数传递给 modelformset_factory 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69953993/