Я практикую Джанго, и я застрял на этом некоторое время. Я пытаюсь написать базовое приложение для опроса. Моя проблема в том, что когда я отправляю свою форму, я вижу, что request.POST
содержит данные, которые мне нужны, form.data
также содержит их, но после запуска form.is_valid()
у меня остаются только ключи в dict, нет ценности.
class SurveyForm(forms.Form):
def __init__(self, *args, **kwargs):
questions = kwargs.pop('questions')
super(SurveyForm, self).__init__(*args, **kwargs)
for q in questions:
choices = []
for answer in q.choice_set.all():
choices.append((answer.pk, answer.choice_text))
self.fields[q.id] = forms.ChoiceField(label=q.question_text, required=False,
choices=choices, widget=forms.RadioSelect)
def answers(self):
for q, a in self.cleaned_data.items():
yield a
Если я удаляю required=False
, я продолжаю получать This field is required
, хотя, я полагаю, это из-за проверки, потому что похоже, что страница обновляется, когда я нажимаю "Отправить", а если я фактически оставляю выбор пустым, это не ' t и вместо надписи появляется небольшое всплывающее окно.
Вот представление, которое использует это.
def step(request, survey_id, attempt_id, surveypage_nr):
survey = get_object_or_404(Survey, pk=survey_id)
attempt = get_object_or_404(Attempt, pk=attempt_id)
pages = survey.surveypage_set.all().order_by('page_nr')
page = pages.filter(page_nr=surveypage_nr).first();
questions = page.question_set.all()
form = SurveyForm(request.POST or None, questions=questions)
if form.is_valid():
for a in form.answers():
answer = get_object_or_404(Choice, pk=a)
attempt.score = attempt.score + answer.score
attempt.save()
return HttpResponseRedirect(reverse('results', args=(survey.id, attempt.id,)))
else:
context = {'page': page, 'form': form}
return render(request, 'survey/surveypage.html', context)
Я попытался проверить содержимое формы после вызова is_valid()
:
request.POST = {'3': '2', '4': '3', 'csrfmiddlewaretoken': 'f..m1'}
form.data = {'3': '2', '4': '3', 'csrfmiddlewaretoken': 'f..m1'}
form.cleaned_data = {3: '', 4: ''}. # Why are you cleaning my values, Django?
form.fields = OrderedDict([(3, <django.forms.fields.ChoiceField object at 0x106c2d5f8>),
(4, <django.forms.fields.ChoiceField object at 0x1055ebba8>)])
Как видите, request.POST
и form.data
содержат именно то, что мне нужно, но после проверки, form.cleaned_data
не имеет значений для ключей. Почему это происходит? Помогите пожалуйста.