Как передать данные в форму 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)
Я считаю, что одним из решений этой проблемы является то, что при создании ваших моделей:
- Создайте модель вопроса
- Создайте модель выбора и свяжите ее с конкретным вопросом
Возможно, это просто то, как вы скопировали и вставили свой код в вопрос, но отступы выглядят неправильно.
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)