[英]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.POST
和form.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.