Реализация множественного (флажок) Select + «Другой» виджет в Django - PullRequest
3 голосов
/ 19 июля 2011

Мне нужно заполнить CharField результатом набора флажков плюс «другой» вариант [укажите] (значение будет «option-a, other» для состояния формы ниже).Форма может выглядеть следующим образом:

[x] option a
[ ] option b
[x] other

If you selected "other", please specify. [__________]

Мне удалось пройти большую часть пути, реализовав подкласс MultipleChoiceField:

class CommaStringMultipleChoiceField(MultipleChoiceField):
    def to_python(self, value):
        return [val.rstrip().lstrip() for val in value.split(',')]

    def clean(self, value):
        return ",".join([val.rstrip().lstrip() for val in value])

В своем классе формы я назначаюэто поле в моем поле формы:

TYPE_CHOICES = [
    (u'option-a',u"Option A"),
    (u'option-b',u"Option B"),
    (u'other', u"Other"),
]

type = CommaStringMultipleChoiceField(
    choices=TYPE_CHOICES,
    widget=CheckboxSelectMultiple
)

Это правильно отображает форму, и вызывается мой метод clean (), но когда я сохраняю форму, я получаю ошибку проверки:

Value u'education,other' is not a valid choice.

Я играл с добавлением собственного валидатора, но пока это не имело никакого значения.Чего не хватает?

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Поскольку ошибка возникает только после сохранения экземпляра модели из формы, убедитесь, что ошибка «Value u'education, other» не является допустимым выбором »возникает из проверки модели вместо форма проверка.Это может произойти, если у вас также установлено choices в поле модели, когда вы действительно хотите сохранить там строку произвольной формы.

0 голосов
/ 19 июля 2011

Возможно, вам потребуется переопределить метод Validate в вашем классе. В коде на https://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L682 вы увидите, где возникает сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...