簡體   English   中英

如何將自定義驗證添加到Django modelForm?

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

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