[英]Django: How do I add data to a ModelForm subclass before validation?
[英]How do I add custom validation to a Django modelForm?
我有以下Django modelform。 我的表單用於在時間表上輸入時間,並且有start_time和end_time字段。 我想添加一個自定義檢查,以確保start_time在end_time之前或小於end_time,或者如果沒有,則向用戶提供一些反饋。 我正在嘗試創建一個自定義的干凈方法來做到這一點,但我做錯了什么。
(來自models.py的摘錄)
class TimesheetEntry(Model):
WORKED='worked'
SICK='sick'
VACATION='vacation'
TIME_CHOICES=(
(WORKED,'Worked'),
(SICK,'Sick'),
(VACATION,'Vacation'))
timesheet = models.ForeignKey('Timesheet', related_name='entries')
start_time = models.DateTimeField(default=datetime.datetime.now)
end_time = models.DateTimeField(blank=True, null=True)
(摘自Forms.py)
class TimesheetEntryForm(forms.ModelForm):
start_time = forms.DateTimeField(widget=forms.SplitDateTimeWidget())
end_time = forms.DateTimeField(widget=forms.SplitDateTimeWidget())
class Meta:
model = TimesheetEntry
exclude = ['timesheet']
def clean(self, *args, **kwargs):
super(TimesheetEntryForm, self).clean(*args, **kwargs)
if self.fields['start_time'] >= self.fields['end_time']:
raise ValidationError("Start Time should be less than End Time")
當我提交表單時(無論start_time小於還是大於end_time,我奇怪地得到兩個錯誤之一,沒有明顯的原因,為什么每次都不給我相同的信息。它不會更新數據庫,並且我可以反復嘗試重復提交具有相同數據的相同表格,並且會給我以下兩個錯誤之一,而其中一個錯誤的概率約為50%。我知道這是一個很大的難題,但是我我希望有人可以發現我正在犯的一個明顯錯誤,並幫助我弄清楚如何糾正此錯誤。
TypeError: argument of type 'NoneType' is not iterable
-要么-
NameError: global name 'ValidationError' is not defined
應該注意的是,通過從方法中刪除clean()方法,將停止錯誤並允許我輸入新的條目(包括導致總小時數為負的條目,這是我要解決的最終問題)
關於NameError,只需:
from django.core.exceptions import ValidationError
還有一點說明,而不是重寫表單字段,請在表單的Meta中執行以下操作:
widgets = {
'start_time': SplitDateTimeWidget(),
'end_time': SplitDateTimeWidget(),
}
最后,清潔方法應如下所示:
def clean(self):
cleaned_data = super(TimesheetEntryForm, self).clean()
if cleaned_data.get('start_time') >= cleaned_data.get('end_time'):
raise ValidationError("blah blah")
希望能幫助到你!
兩個錯誤:首先,您應該訪問self.cleaned_data['start_time']
(和end_time
); 其次,您需要引用forms.ValidationError
。
同樣,這樣做也不會造成傷害,但是實際上並不需要調用超級清除方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.