Форменкод Схема добавления полей динамически

Давайте возьмем, например, пользователя 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

Другие вопросы по тегам