将request.user参数传递给modelformset_factory表单



所以我有一个绑定到模型的表单集,其中一个字段是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})

最新更新