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 составной валидатор, который не определяет if_missing В отличие от All составной валидатор). Также следующие команды демонстрируют это:

>>> 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)
Другие вопросы по тегам