Форменкод Схема добавления полей динамически
Давайте возьмем, например, пользователя Schema
где администратор сайта устанавливает количество запрашиваемых телефонных номеров:
class MySchema(Schema):
name = validators.String(not_empty=True)
phone_1 = validators.PhoneNumber(not_empty=True)
phone_2 = validators.PhoneNumber(not_empty=True)
phone_3 = validators.PhoneNumber(not_empty=True)
...
Каким-то образом я думал, что мог бы просто сделать:
class MySchema(Schema):
name = validators.String(not_empty=True)
def __init__(self, *args, **kwargs):
requested_phone_numbers = Session.query(...).scalar()
for n in xrange(requested_phone_numbers):
key = 'phone_{0}'.format(n)
kwargs[key] = validators.PhoneNumber(not_empty=True)
Schema.__init__(self, *args, **kwargs)
так как я прочитал в документах FormEncode:
Валидаторы используют переменные экземпляра для хранения информации о настройке. Вы можете использовать подклассы или обычные экземпляры для их установки.
а также Schema
вызывается в документах как составной валидатор и является подклассом FancyValidator
поэтому я догадался, что это правильно.
Но это не работает: просто добавлено phone_n
игнорируются и только name
необходимо.
Обновить:
Также я попробовал оба переопределения __new__
а также __classinit__
прежде чем спрашивать безуспешно...
1 ответ
У меня была такая же проблема, я нашел решение здесь: http://markmail.org/message/m5ckyaml36eg2w3m
все дело в том, чтобы использовать метод add_field схемы в вашем методе init
class MySchema(Schema):
name = validators.String(not_empty=True)
def __init__(self, *args, **kwargs):
requested_phone_numbers = Session.query(...).scalar()
for n in xrange(requested_phone_numbers):
key = 'phone_{0}'.format(n)
self.add_field(key, validators.PhoneNumber(not_empty=True))
я не думаю, что есть необходимость позвонить родительскому init