簡體   English   中英

Django form.is_valid()清除所需的值

[英]Django form.is_valid() cleans needed values

我正在練習Django,現在已經堅持了一段時間。 我正在嘗試編寫一個基本的調查應用程序。 我的問題是,當我提交表單時,我可以看到該request.POST form.data包含了我需要的數據, form.data也包含了它,但是在運行form.is_valid() ,我只剩下字典中的鍵,沒有值。

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盡管我認為這是由於驗證所致,因為當我單擊“提交”時,頁面看起來像在刷新,而如果我將選項保留為空白,則不會刷新而是在標簽上方顯示了一個小彈出窗口。

這是使用它的視圖。

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.POSTform.data完全包含我所需要的內容,但是在驗證之后, form.cleaned_data沒有鍵的值。 為什么會這樣呢? 幫助請。

form.cleaned_data的鍵是string,而form.data是int。

正如另一個答案指出的那樣,密鑰必須是字符串。 POST中的數據始終是字符串,但是您的密鑰當前為int。 因此,當Django驗證字段'3'的數據時,它什么也沒找到,因此將其顯示為空。 同時,它沒有名為3的字段,因此會丟棄該鍵/值。

您應該將字段ID設置為字符串:

self.fields[str(q.id)] = ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM