Обязательное логическое поле?

У меня есть логическое поле,

is_operable = BooleanField(widget=RadioSelect(choices=YES_OR_NO, renderer=InlineRadioFieldRenderer), required=False, initial=True)

Это отображается как два переключателя (да или нет), но я хочу, чтобы это было обязательным. Проблема в том, что если я изменю его на required=True, он выдаст ошибку проверки, когда получит False.

Это можно обойти?


YES_OR_NO = (
    (True, 'Yes'),
    (False, 'No')
)

person mpen    schedule 05.08.2010    source источник
comment
choices = YES_OR_NO? Является ли False одним из возможных вариантов? ОБНОВИТЕ свой вопрос, указав недостающий код.   -  person S.Lott    schedule 05.08.2010
comment
обходной путь: вместо указания required = True укажите начальное значение True / False.   -  person Ashok    schedule 05.08.2010
comment
@ С.Лотт: Извини. Думал, это можно было сделать предположение. Обновленный вопрос. @Ashok: Я указал начальное значение ... но проблема не только в том, чтобы заставить их выбрать что-то, это с точки зрения пользовательского интерфейса, я поставил (необязательно) рядом со всеми необязательными полями.   -  person mpen    schedule 05.08.2010
comment
@Mark: Ничего не может быть выведено. Мы не можем угадать, какой код вы используете. Часть, которую вы не опубликовали, могла содержать ошибку.   -  person S.Lott    schedule 05.08.2010
comment
@ S.Lott: ошибки не было; это был ожидаемый результат, но не тот, который мне нужен.   -  person mpen    schedule 05.08.2010
comment
@Mark: ожидаемый результат, но не тот, который мне нужен? Это сложно интерпретировать. Означает ли это, что вы хотели, чтобы Джанго был волшебным образом отличным от того, который есть на самом деле? Что это обозначает?   -  person S.Lott    schedule 05.08.2010
comment
@ S.Lott: Что-то в этом роде. Django рассматривает False как невыполнение необходимого условия. Спорный вопрос, является ли это хорошим поведением, но я не этого хочу.   -  person mpen    schedule 06.08.2010
comment
@Mark: но это не то, что я хочу. это был ожидаемый результат. Итак, вы хотите чего-то, чего не делает Django? Это то, что это за вопрос?   -  person S.Lott    schedule 06.08.2010
comment
@ S.Lott: Нет. Django (очевидно) может делать то, что я хочу, только не так, как я это написал. То, что я написал, произвело задокументированное ожидаемое поведение в соответствии со спецификациями Django, поэтому мне нужно было найти другой способ написать это, чтобы избежать указанного поведения. Ты сейчас просто пытаешься меня помучить?   -  person mpen    schedule 06.08.2010
comment
@Mark: Нет. Я озадачен вашими комментариями. но это не то, что я хочу. это был ожидаемый результат. Это очень и очень сбивает с толку. Если он делает то, что вы ожидали, у вас не может быть вопросов.   -  person S.Lott    schedule 06.08.2010
comment
@ С.Лотт: Да, я могу! Отлично. Скажем так. В моем коде была ошибка. Django не сделал ничего плохого.   -  person mpen    schedule 06.08.2010
comment
@Mark: Значит, это был ожидаемый результат, но не тот, который мне нужен, означает, что вы знали, что у вас есть ошибка? Вы ожидали ошибки? Итак, ваш вопрос: у меня есть известная мне ошибка? Или он делает то, что я ожидал, но почему это так? Мне действительно трудно понять, чего вы не знали и чего просите узнать, чего вы еще не знали.   -  person S.Lott    schedule 06.08.2010


Ответы (2)


Я бы рекомендовал использовать TypedChoiceField, который переводит варианты YES_OR_NO в логическое значение. См. Документы: http://docs.djangoproject.com/en/1.2/ref/forms/fields/#django.forms.TypedChoiceField.

person Mark Lavin    schedule 05.08.2010
comment
Да, сэр, это легко исправить :) TypedChoiceField(widget=RadioSelect, choices=YES_OR_NO, required=True, initial=True, empty_value=None, coerce=bool) - person mpen; 05.08.2010
comment
Разве bool не может просто привести оба значения к True? В частности, bool('False') оценивается как True. - person Jian; 07.12.2012
comment
Верный. coerce=bool не будет работать, поскольку bool('False') равно True. Вам понадобится специальная функция принуждения. бывший. lambda x: x == 'True' - person Bran Handley; 15.04.2013

Оставьте его как required=False и напишите собственный clean_is_operable метод, который проверяет, что у вас есть то, что вы хотите, иначе выдает ValidationError или что-то подобное.

person Steve Jalim    schedule 05.08.2010