Сейчас по работе начал использовать 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 показал, что проблема уже не нова, но авторы ее пока фиксить не собираются, да и предложенное решение было явно over-designed. Так что я не долго думая написал кастомный виджет и самую малость подправил SelectField
для того, чтобы ROLE_CHOICES
в итоге рендерился так:
Сразу предупреждаю, что задача решалась в лоб и возможно существует более универсальное решение, которое подойдет не только для SelectField
, но и для SelectMultipleField
, но так как последнее поле не используется в моем проекте, то я на него даже не смотрел :) В целом, код доступен как гист на гитхабе, удачного использования :)
update. Хм, начинаю сомневаться в адекватности автора WTForms и разумности позиционирования этой библиотеки взамен Django forms, ибо даже не могу найти слов как интерпретировать позицию по закрытию как invalid бага #47 Required IntegerField misvalidates "0". Это же клиника или каким образом 0 не валидное целое число?