#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 не может быть и речи.