簡體   English   中英

Django self.cleaned_data Keyerror

[英]Django self.cleaned_data Keyerror

我正在寫一個Django網站,我正在編寫自己的表單驗證:

class CreateJobOpportunityForm(forms.Form):
    subject = forms.CharField(max_length=30)
    start_date = forms.DateField(widget=SelectDateWidget)
    end_date = forms.DateField(widget=SelectDateWidget)

    def clean_start_date(self):
        start_date = self.cleaned_data['start_date']
        end_date = self.cleaned_data['end_date']
        if start_date > end_date :
            raise forms.ValidationError("Start date should be before end date.")
        return start_date

但是當start_date小於end_date時,它會說:

KeyError at /create_job_opportunity
'end_date'

為什么不識別'end_date'鍵?

由於一個字段依賴於另一個字段,因此最好使用表單的clean方法進行clean ,而不是使用單獨的clean_field方法。

def clean(self):
    cleaned_data = super(CreateJobOpportunityForm, self).clean()
    end_date = cleaned_data['end_date']
    start_date = cleaned_data['start_date']
    # do your cleaning here
    return cleaned_data

否則,您必須確保在start_date之前清除end_date字段。

發生這種情況是因為在檢查end_date是否有效之前嘗試獲取end_date的clean_data。 如果在start_date之前聲明end_date,則在此情況下驗證end_date,之后調用clean_start_date。 在start_date之前聲明end_date,如下所示:

class CreateJobOpportunityForm(forms.Form):
    subject = forms.CharField(max_length=30)
    end_date = forms.DateField(widget=SelectDateWidget)
    start_date = forms.DateField(widget=SelectDateWidget)

    def clean_start_date(self):
        start_date = self.cleaned_data['start_date']
        end_date = self.cleaned_data['end_date']
        if start_date > end_date :
            raise forms.ValidationError("Start date should be before end date.")
        return start_date

更換

end_date = self.cleaned_data['end_date']

end_date = self.data.get('end_date')

要么

start_date之前清理end_date字段。

暫無
暫無

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

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