2017-06-06 20 views
0

我有一個問題,FormEncode沒有確認驗證器有if_missing集。它不斷返回該字段的「缺失錯誤」錯誤。Formencode忽略if_missing

我有一個模式,看起來像這樣

class ABCSchema(Schema): 

allow_extra_fields = True 
filter_extra_fields = True 

primary_surname = validators.UnicodeString(not_empty=True) 
mailing_address_1 = validators.UnicodeString(not_empty=True) 
mailing_address_2 = validators.UnicodeString() 
mailing_city = validators.UnicodeString(not_empty=True) 
mailing_state = national.USStateProvince(not_empty=True) 
mailing_zip = national.USPostalCode(not_empty=True) 
billing_address_is_same_as_mailing = validators.StringBool(if_empty=False, not_empty=False) 
billing_address_1 = validators.UnicodeString(if_missing=None) 
billing_address_2 = validators.UnicodeString(if_missing=None) 
billing_city = validators.UnicodeString(if_missing=None) 
billing_state = national.USStateProvince(if_missing=None) 
billing_zip = national.USPostalCode(if_empty=None, not_empty=False) 
special_instructions = validators.UnicodeString() 

有問題的驗證是billing_zip。

這個想法是,用戶可以選擇翻轉billing_address_is_same_as_mailing標誌。這將禁用帳單地址字段,以防止提交這些字段。

在表單提交該請求具有下列值

NestedMultiDict([('primary_surname', 'Something'), ('mailing_address_1', '81 turnbull St'), ('mailing_address_2', ''), ('mailing_city', 'Tampa'), ('mailing_state', 'NE'), ('mailing_zip', '98754'), ('billing_address_is_same_as_mailing', 'True'), ('special_instructions', ''), ('submit', 'Submit')]) 

這是驗證具有下列數據和錯誤類型的字典。

{'special_instructions': '', 'billing_city': None, 'mailing_city': 'Budd Lake', 'primary_surname': 'Something', 'billing_address_is_same_as_mailing': 'True', 'billing_state': None, 'mailing_address_1': '81 turnbull St', 'billing_zip': None, 'mailing_zip': '07828', 'mailing_state': 'NE', 'billing_address_2': None, 'submit': 'Submit', 'billing_address_1': None, 'mailing_address_2': '8 Locust St'} 
{'billing_zip': 'Missing value'} 

我試過if_empty,if_missing和not_empty各種組合,但我似乎無法得到驗證,如果billing_zip缺少通過。但是,它似乎沒有抱怨其他計費領域。

我錯過了什麼?

回答

1

USPostalCode確實忽略了if_missing選項。可以在源代碼中看到(USPostalCode被實現爲Any化合物驗證程序,其不像All複合驗證程序那樣定義了if_missing)。另外下面的命令演示它:

>>> validators.Regex(r'^\d+$', not_empty=False, if_missing='').if_missing 
'' 
>>> national.USPostalCode(not_empty=False, if_missing='').if_missing 
<class 'formencode.api.NoDefault'> 

它應該是formencode中的一個錯誤。

作爲一個可能的解決方法,if_missing可以手動地定義爲每個校驗:

us_postal_code_validator = national.USPostalCode(if_empty=None, not_empty=False) 
us_postal_code_validator.if_missing = '' 

class ABCSchema(Schema): 
    allow_extra_fields = True 
    filter_extra_fields = True 
    billing_zip = us_postal_code_validator 

或者if_key_missing可以針對整個模式定義(但要小心,因爲它會影響在該模式中的所有字段):

class ABCSchema(Schema): 
    if_key_missing = '' 
    allow_extra_fields = True 
    filter_extra_fields = True 
    billing_zip = national.USPostalCode(if_empty=None, not_empty=False) 
+1

你是對的。我繼續並提出了一個項目問題。請參閱https://github.com/formencode/formencode/issues/129。如果沒有人接受它,我會添加一個PR來添加實現,除非你想這樣做。無論哪種方式,感謝您的幫助! – danclark