python render_field 燒瓶WTForms:DataRequired和InputRequired之間的區別



wtforms jinja2 example (1)

wtforms.valiadators DataRequiredInputRequired之間有什麼區別

我在註冊表單中有一些字段:

username
password 
password_repeat 
submit

這些字段是否應該使用DataRequiredInputRequired驗證器?


簡答

除非你有一個很好的理由你應該使用InputRequired

為什麼?

讓我們看看文檔/代碼中的一些註釋:

請注意,在DataRequired和InputRequired之間有一個區別,它提供了表單輸入數據,DataRequired查看了強制後數據。

注意,這個驗證器曾經被稱為Required但它的行為方式(要求強制數據,而不是輸入數據)意味著它的運行方式與Optional驗證器不是對稱的,而​​且還會造成某些將數據強制為“falsey”像0Decimal(0)time(0)等值除非存在一個非常具體的原因,我們建議使用:class: InputRequired來代替。

這是什麼意思?

Form類中,您會注意到兩個關鍵字參數formdatadata 。 這些通常對應於兩個方法processprocess_formdata 。 當表單數據進入線路時,並不總是與Field類型對應的格式。 一個很好的例子是提供給IntegerField的值u'1' 。 如果你有一個NumberRange驗證器,這將是一個壞消息,因為u'1'不是一個數字。

process_formdata方法的主要目的是通過在運行驗證規則之前將值強制為正確的類型來防止這種情況。 這就是他們所說的“看後強制數據”

問題!

InputRequiredDataRequired都以與__call__實現相同的方式工作:

def __call__(self, form, field):
    if not field.data or isinstance(field.data, string_types) and not field.data.strip():
        if self.message is None:
            message = field.gettext('This field is required.')
        else:
            message = self.message

某些字段類型將數據強制為Falsey值(0,Decimal(0)等)。 當你有一個IntegerField ,就會出現這個問題,表單提交的值就像是'0' 。 如果將DataRequired應用於此,則驗證失敗。 這是因為DataRequired將評估if not field.data...後強制其中field.dataFalsey數值0





flask-wtforms