Как передать данные в форму Django?

Я использую Django 4.0 и пытаюсь создать веб-приложение, в котором пользователь выбирает вариант из выпадающей Django-формы. Однако выбор будет меняться в зависимости от вопроса, и я хочу, чтобы форма могла адаптироваться к этому.

Вот что у меня есть в файле forms.py:

class QuestionAnswerForm(forms.Form):
def __init__(self, q_id, *args, **kwargs):
    self.q_id = q_id
    super(QuestionAnswerForm, self).__init__(*args, **kwargs)

q_id = self.q_id  # this line throws an error
question = Question.objects.get(pk=q_id)
choice = forms.ChoiceField(choices=get_choices(question))

Однако я получаю ошибку: имя 'self' не определено. Я просто хочу знать простой способ передачи идентификатора вопроса в форму, чтобы функция get_choices могла вернуть варианты, которые нужно отобразить на форме.

В файле views.py начало моего представления для вопроса задает форму таким образом:

def question_detail_view(request, q_id):
    print(f"Question id is {q_id}")
    form = QuestionAnswerForm(request.POST or None, q_id=q_id)

Я считаю, что одним из решений этой проблемы является то, что при создании ваших моделей:

  1. Создайте модель вопроса
  2. Создайте модель выбора и свяжите ее с конкретным вопросом

Возможно, это просто то, как вы скопировали и вставили свой код в вопрос, но отступы выглядят неправильно.

from .models import Question    # I figure you have something like this already?


class QuestionAnswerForm(forms.Form):
    def __init__(self, q_id, *args, **kwargs):
        self.q_id = q_id
        super(QuestionAnswerForm, self).__init__(*args, **kwargs)

        q_id = self.q_id  # this line throws an error
        question = Question.objects.get(pk=q_id)
        choice = forms.ChoiceField(choices=get_choices(question))

Другими словами, self определяется только внутри функции __ini__, а не за ее пределами, где он мог бы оказаться, если бы не был отступом.

Я нашел, как это сделать, используя Passing **kwargs to Django Form:

forms.py:

class QuestionAnswerForm(forms.Form):

    def __init__(self, *args, **kwargs):
        q_id = kwargs.pop('q_id')
        super(QuestionAnswerForm, self).__init__(*args, **kwargs)

        if q_id:
            self.fields['choice'].choices = get_choices(Question.objects.get(pk=q_id))

    choice = forms.ChoiceField()

views.py:

def question_detail_view(request, q_id):
form = QuestionAnswerForm(request.POST or None, q_id=q_id)
Вернуться на верх