简体   繁体   English

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

[英]Pass request.user parameter to modelformset_factory form

So I've a formset tied to a model and one of the fields in that is ForeignKey .所以我有一个与模型相关的表单集,其中一个字段是ForeignKey

models.py模型.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表格.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")

As you can see, the __init__ function is expecting an extra parameter logged_user which I'm hoping to pass via the views.py file.如您所见, __init__函数需要一个额外的参数logged_user ,我希望通过views.py 文件传递​​该参数。 But if I do the following:但是,如果我执行以下操作:

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})

I'm trying to pass the logged in user as a parameter on line 2 but this is resulting in the following message:我正在尝试将登录用户作为参数传递给第 2 行,但这会导致以下消息:

Field 'id' expected a number but got 'SquadForm'字段“id”需要一个数字但得到“SquadForm”

Not sure what I'm missing here.不确定我在这里缺少什么。 But if I remove the parameter from line 2:但是,如果我从第 2 行中删除参数:

teamformset = modelformset_factory(Squad, extra=series.team_number, form=SquadForm)

it starts working (of course, I no longer expect the user in the forms.py file and remove it too) but shows all the data and not filtered one.它开始工作(当然,我不再期望 forms.py 文件中的用户并将其删除)但显示所有数据而不是过滤数据。

You can pass additional keyword arguments to your formset form by passing form_kwargs={} to your formset您可以通过将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})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM