簡體   English   中英

WTForms:IntegerField跳過對字符串值的強制轉換

[英]WTForms: IntegerField skips coercion on a string value

我有一個帶有單個IntegerFieldForm實例。

IntegerField以<input>使用type="text"呈現到HTML,並且數據以文本字符串的形式從HTML表單回發。 但是,該表單將無法驗證發布的數據是否具有IntegerField的字符串值(通過data參數中的dict傳遞)。

這是一個玩具示例:

from wtforms import validators, Form, IntegerField 

class TestForm(Form):
    num = IntegerField('How Many?', [validators.NumberRange(min=1, max=100)])


test_form1 = TestForm()
print("HTML Render 1: %s" % test_form1.num())

data_in = {'num': '66'}  # Note '66' is a string as would be POSTed
test_form2 = TestForm(data=data_in)
print("HTML Render 2: %s" % test_form2.num())
print("     Validate: %s" % test_form2.validate())
print("       Errors: %s" % test_form2.errors)

輸出為:

HTML Render 1: <input id="num" name="num" type="text" value="">
HTML Render 2: <input id="num" name="num" type="text" value="66">
     Validate: False
       Errors: {'num': [u'Number must be between 1 and 100.']}

IntegerField的文檔字符串說:

IntegerField(Field):一個文本字段,除了所有輸入都被強制為整數

如何強制將str轉換為int ,以便此表單通過驗證?

來自WTForms開發人員之一:

字段僅強制轉換表單數據,而不強制轉換對象數據,這使人們可以使用“像int一樣”的對象,並且仍然可以使它們工作而不會破壞值。 >將正確的數據類型傳遞給對象/扭曲數據是您的責任。

並且從文檔中:

process_formdata(valuelist)處理從表單通過網絡接收的數據。

這將在表單構造期間通過formdata參數提供的數據進行調用。

參數:valuelist –要處理的字符串列表。

在您的示例中,永遠不會調用IntegerField上的process_formdata方法

您正在傳遞一個str ,由於將它作為data關鍵字參數提供,因此不會被強制執行。 data關鍵字參數確切表示您要驗證而無需強制的數據。 因為'66'仍然是str ,驗證程序不會通過它。

formdata關鍵字自變量指示從網絡formdata的數據。 這將經歷該領域的強制過程。 只有一個陷阱,它只接受MultiDict類的對象。 如果您看下面的示例,我使用了webob MutliDictWerkzeug庫中還提供了一個。 如果將常規python字典包裝在MultiDict並將其作為formdata關鍵字提供,則表單將按預期驗證。

from wtforms import validators, Form, IntegerField 
from webob.multidict import MultiDict

class TestForm(Form):
    num = IntegerField('How Many?', [validators.NumberRange(min=1, max=100)])

data_in = {'num': '66'}  # Note '66' is a string as would be POSTed
test_form2 = TestForm(formdata=MultiDict(data_in))
print("HTML Render 2: %s" % test_form2.num())
print("     Validate: %s" % test_form2.validate())
print("       Errors: %s" % test_form2.errors)

HTML Render 2: <input id="num" name="num" type="text" value="66">
     Validate: True
       Errors: {}

暫無
暫無

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

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