![](/img/trans.png)
[英]WTForms: IntegerField skips coercion when string value is '0'
[英]WTForms: IntegerField skips coercion on a string value
我有一個帶有單個IntegerField
的Form
實例。
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 MutliDict
但Werkzeug庫中還提供了一個。 如果將常規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.