Model.Form Queryset
У меня есть model.form, к которой нужно применить набор запросов для фильтрации вариантов, доступных в поле выбора.
class AnswerForm(ModelForm):
class Meta:
model = ProjectQuestionnaireAnswer
fields = ('answer','notes')
widgets = {
'answer': forms.Select(choices = Choice.objects.filter(question_id = 1),attrs={'class': 'form-control select2'}),
'notes': forms.Textarea(attrs={'class': 'form-control','placeholder': 'Add notes to question here'}),
}
class Choice(models.Model):
question = models.ForeignKey(ProjectQuestionnaireQuestion, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
def __str__(self):
return str(self.choice_text)
class ProjectQuestionnaireAnswer(models.Model):
YN_Choices = [
('Yes', 'Yes'),
('No', 'No'),
('Unknown', 'Unknown')
]
question = models.ForeignKey(ProjectQuestionnaireQuestion, on_delete=models.CASCADE)
answer = models.ForeignKey(Choice, on_delete=models.CASCADE,null=True)
notes = models.TextField(blank=True)
response = models.ForeignKey(ProjectQuestionnaireResponse, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=['question','response'], name='project_unique_response2'),
]
def __str__(self):
return str(self.answer)
Я не уверен, как написать запрос, чтобы он возвращал только варианты, связанные с вопросом. Я тестировал с помощью choices = Choice.objects.filter(question_id = 1), который возвращает мне варианты для первого вопроса, но нужно ли это для каждого вопроса?
А как мне представить это в моем шаблоне?
{{ form.answer.choices }} ??
Спасибо
Вам нужно реализовать его в функции __init__.
Вот мое предложение:
class AnswerForm(ModelForm):
class Meta:
model = ProjectQuestionnaireAnswer
fields = ('answer','notes')
widgets = {
'notes': forms.Textarea(attrs={'class': 'form-control','placeholder': 'Add notes to question here'}),
}
def __init__(self, *args, **kwargs):
question_id = kwargs.pop('question_id')
super().__init__(*args, **kwargs)
self.fields['answer'].widget = forms.Select(choices = Choice.objects.filter(question_id = question_id),attrs={'class': 'form-control select2'}),
Затем при инициализации формы нужно передать ей аргумент question_id. Для примера в посте: AnswerForm(question_id=1)
Дайте мне знать, если это сработает.