Схема formencode добавлять поля динамически - PullRequest
3 голосов
/ 21 июля 2011

Возьмем, к примеру, пользователя 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 Ответ

5 голосов
/ 02 мая 2012

У меня была такая же проблема, я нашел решение здесь: http://markmail.org/message/m5ckyaml36eg2w3m

Все, что нужно, это использовать метод схемы add_field в youre 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

...