所以我有一个绑定到模型的表单集,其中一个字段是ForeignKey
。
型号.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
表单.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文件传递这个参数。但如果我做以下操作:
视图.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行,但这导致了以下消息:
字段"id"应为数字,但得到了"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})