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)

Дайте мне знать, если это сработает.

Вернуться на верх