简体   繁体   English

在modelformset_factory中时,属性未传递给modelform构造函数

[英]Attribute not being passed to modelform constructor when in modelformset_factory

I have a form where I am trying to limit the choices which appear in the field 'question' (In this case, I only want questions which the user has created). 我有一个表格,试图限制出现在“问题”字段中的选择(在这种情况下,我只希望用户创建的问题)。 This method has worked with other forms, but it doesn't work this time - probably because it is a ModelFormset rather than just a ModelForm 此方法可用于其他表单,但是这次不起作用-可能是因为它是ModelFormset而不是ModelForm

The exact error is - 'NoneType' object has no attribute 'username' , which I suspect means that the 'user' object is not being passed to AnswerForm's constructor. 确切的错误是-'NoneType'对象没有属性'username' ,我怀疑这意味着'user'对象没有传递给AnswerForm的构造函数。 Problem is, I have no idea why it's not being passed 问题是,我不知道为什么不通过

#views.py
def add_answer(request):
        a_form = modelformset_factory(Answer, form=AnswerForm(user=request.user), fields='__all__', min_num=2, max_num=4, validate_min=True)
        if request.method == "POST":
            form = a_form(request.POST)
            if form.is_valid():
                #Do something
        return render(request, 'site/addanswer.html', {'a_form': a_form})

#forms.py
class AnswerForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(AnswerForm, self).__init__(*args, **kwargs)
        self.fields['question'] = forms.ModelChoiceField(queryset=Question.objects.filter(user__username=self.user.username))

    class Meta:
        model = Answer
        fields = ('question', 'answer', 'correct')

#models.py
class Question(models.Model):
    user = models.ManyToManyField(User)
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    question = models.TextField(max_length=1000)

    def __str__(self):
        return "{0}".format(self.question)

class Answer(models.Model):
    question = models.ForeignKey(Question)
    answer = models.TextField(max_length=1000)
    correct = models.BooleanField()

    def __str__(self):
        return "{0}".format(self.answer)

Maybe self.user get overwritten by super . 也许self.usersuper覆盖。 Also there is no need to query user.username . 同样也不需要查询user.username

#forms.py
class AnswerForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(AnswerForm, self).__init__(*args, **kwargs)
        self.fields['question'] = forms.ModelChoiceField(queryset=Question.objects.filter(user=user))

    class Meta:
        model = Answer
        fields = ('question', 'answer', 'correct')

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

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