Django form.is_valid () очищает необходимые значения - PullRequest
0 голосов
/ 04 мая 2018

Я практикую Джанго, и я застрял на этом некоторое время. Я пытаюсь написать базовое приложение для опроса. Моя проблема в том, что когда я отправляю свою форму, я вижу, что 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 не имеет значений для ключей. Почему это происходит? Помогите пожалуйста.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Как указано в другом ответе, ключ должен быть строкой. Данные в POST всегда являются строкой, но ваши ключи в настоящее время int. Поэтому, когда Django отправляется для проверки данных для поля '3', он ничего не находит, поэтому показывает его как пустое; Между тем у него нет поля с именем 3, поэтому выбрасывает этот ключ / значение.

Вы должны установить свои идентификаторы полей в строки:

self.fields[str(q.id)] = ...
0 голосов
/ 04 мая 2018

ключ в form.cleaned_data является строкой, но form.data является int.

...