ModelMultipleChoiceField возвращает набор запросов вместо экземпляра объекта

#python #django #django-forms

#python #django #django-формы

Вопрос:

Здравствуйте, у меня возникла эта проблема с выбором нескольких флажков, у меня есть эта форма

форма ответа класса(формы.ModelForm): класс Meta: модель = Поля ответа = (‘ответ’, )

 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)
  

Комментарии:

1. Не могли бы вы опубликовать свой models.py

2. обновлено с помощью model @EricAcevedo

Ответ №1:

Я думаю, вам следует использовать ManyToManyField в Response классе вместо 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())
  

не забудьте добавить get_success_url() метод в Response модель

Комментарии:

1. Я не могу использовать ManyToManyField, потому что модель ответа изменяет форму, я также использую его для переключателя в зависимости от вопроса, если вы проверяете форму, которую я проверяю на тип вопроса перед отображением полей ответа if question.question_field_type == 'multiple': , поэтому о ManyToManyField не может быть и речи.