вторник, 10 января 2012 г.

Добавляем поддержку optgroup в wtforms.fields.SelectField

Сейчас по работе начал использовать WTForms и все бы в них просто и понятно, и можно легко и быстро перейти к ним от Django forms, но один момент меня очень разочаровывал, отсутствие поддержки optgroup в SelectField для, например, следующих choices:

ROLE_CHOICES = (
    ('Content Creation', (
        ('project_manager', 'Project Manager'),
        ('writer', 'Writer'),
        ('editor', 'Editor'),
        ('senior_editor', 'Senior Editor'),
    )),
    ('Content Distribution', (
        ('dist_project_manager', 'Project Manager'),
        ('dist_content_publisher', 'Publisher'),
        ('dist_content_reviewer', 'Reviewer'),
    ))
)

Точнее есть, но какая-то уж очень неверная :) Ибо следующая форма,

from wtforms import fields, form


class SettingsForm(form.Form):

    default_role = fields.SelectField(choices=ROLE_CHOICES, ...)
    decimal_value = fields.DecimalField(...)
    int_value = fields.IntegerField(...)

отображалась вот таким корявым способом:

WTForms SelectField

Быстрый поиск по интернету и багам WTForms показал, что проблема уже не нова, но авторы ее пока фиксить не собираются, да и предложенное решение было явно over-designed. Так что я не долго думая написал кастомный виджет и самую малость подправил SelectField для того, чтобы ROLE_CHOICES в итоге рендерился так:

WTForms extended SelectField

Сразу предупреждаю, что задача решалась в лоб и возможно существует более универсальное решение, которое подойдет не только для SelectField, но и для SelectMultipleField, но так как последнее поле не используется в моем проекте, то я на него даже не смотрел :) В целом, код доступен как гист на гитхабе, удачного использования :)

update. Хм, начинаю сомневаться в адекватности автора WTForms и разумности позиционирования этой библиотеки взамен Django forms, ибо даже не могу найти слов как интерпретировать позицию по закрытию как invalid бага #47 Required IntegerField misvalidates "0". Это же клиника или каким образом 0 не валидное целое число?

blog comments powered by Disqus