【问题标题】:ModelMultipleChoiceField returns queryset instead of object instanceModelMultipleChoiceField 返回查询集而不是对象实例
【发布时间】:2021-02-27 04:29:12
【问题描述】:

您好,我有多个复选框选择的问题 我有这个表格

类 AnswerForm(forms.ModelForm): 元类: 模型 = 响应 字段 = ('答案', )

def __init__(self, *args, **kwargs):
    question = kwargs.pop('question')
    super().__init__(*args, **kwargs)
    self.fields['answer'].queryset = question.answers.order_by('text')
    if question.question_field_type == 'multiple':
        self.fields['answer'] = forms.ModelMultipleChoiceField(
            widget=forms.CheckboxSelectMultiple(
                attrs={'autocomplete': 'off'}),
            queryset=question.answers.order_by('text'),
        )

我的问题是提交时会引发此错误

"<QuerySet [<Answer: A. High School Diploma>, <Answer: B. Associate's Degree>]>": "Response.answer" must be a "Answer" instance.

如何使这些返回答案实例而不是查询集。

型号

class Question(models.Model):
    RADIO = 'radio'
    SELECT = 'select'
    TEXT = 'text'
    MULTI = 'multiple'
    QUESTION_TYPES = (
        (RADIO, 'radio'),
        (SELECT, 'select'),
        (TEXT, 'text'),
        (MULTI, 'multiple'),

    )
    text = models.CharField(
        max_length=512,
        help_text="this text will be displayed to the user taking the survey"
    )
    question_number = models.PositiveIntegerField(
        default=0,
        help_text='Use for question ordering, by default questions are ordered by text'
    )
    partner_related_question = models.BooleanField(
        default=False,
        help_text='this will be used to match ideal partner against user choices'
    )
    question_field_type = models.CharField(
        choices=QUESTION_TYPES, max_length=15)

    created_date = models.DateField(auto_now_add=True)

    objects = QuestionManager()

    class Meta:
        ordering = ['question_number']

    def __str__(self):
        return self.text
class Answer(models.Model):
    question = models.ForeignKey(
        Question, on_delete=models.CASCADE, related_name='answers')
    text = models.CharField('Answer', max_length=512)

    def __str__(self):
        return self.text


class Response(models.Model):
    person = models.ForeignKey(
        Person, on_delete=models.CASCADE, related_name='person_answers')
    answer = models.ForeignKey(
        Answer, on_delete=models.CASCADE, related_name='+')
    created = models.DateTimeField(default=now, editable=False)

【问题讨论】:

  • 你能发布你的models.py
  • 更新了模型@EricAcevedo

标签: python django django-forms


【解决方案1】:

我认为你应该在Response 类中使用ManyToManyField 而不是ForeignKey:

class Response(models.Model):
    ...
    answers = models.ManyToManyField(Answer)
    ...

# forms.py
class AnswerForm(forms.ModelForm):
    class Meta:
        model = Response
        fields = ('answers', )

那么在您使用 CBV CreateView 的情况下,覆盖 form_valid 如下:

def form_valid(self, form):
    self.object = form.save()
    for answer in form.cleaned_data['answers']:
        answer.save()
        self.object.answers.add(answer)
    return HttpResponseRedirect(self.get_success_url())

记得在Response模型中添加get_success_url()方法

【讨论】:

  • 我不能使用 ManyToManyField,因为答案模型会更改表单我也将它用于单选按钮,这取决于问题如果您在呈现答案字段if question.question_field_type == 'multiple': 之前检查我检查问题类型的表单,所以ManyToManyField 是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多