Отображать поле логической модели в форме Django в качестве переключателя, а не флажок по умолчанию - PullRequest
11 голосов
/ 23 июня 2009

Вот как я это сделал, чтобы отобразить поле булевой модели в виде переключателей Да и Нет.

choices = ( (1,'Yes'),
            (0,'No'),
          )

class EmailEditForm(forms.ModelForm):

    #Display radio buttons instead of checkboxes
    to_send_form = forms.ChoiceField(choices=choices,widget=forms.RadioSelect)

    class Meta:
    model = EmailParticipant
    fields = ('to_send_email','to_send_form')

    def clean(self):
    """
    A workaround as the cleaned_data seems to contain u'1' and u'0'. There may be a better way.
    """

    self.cleaned_data['to_send_form'] = int(self.cleaned_data['to_send_form'])
    return self.cleaned_data

Как вы можете видеть из приведенного выше кода, мне нужен чистый метод, который преобразует входную строку в целое число, которое может быть ненужным.

Есть ли лучший и / или djangoic способ сделать это. Если да, то как?

И нет, использование BooleanField, кажется, вызывает гораздо больше проблем. Использование этого казалось очевидным для меня; но это не так. Почему это так.

Ответы [ 4 ]

15 голосов
/ 23 июня 2009

Использование TypedChoiceField.

class EmailEditForm(forms.ModelForm):
    to_send_form = forms.TypedChoiceField(
                         choices=choices, widget=forms.RadioSelect, coerce=int
                    )
6 голосов
/ 17 июля 2010
field = BooleanField(widget=RadioSelect(choices=YES_OR_NO), required=False)


YES_OR_NO = (
    (True, 'Yes'),
    (False, 'No')
)
2 голосов
/ 30 мая 2010

Используйте это, если вы хотите горизонтальный рендер.

http://djangosnippets.org/snippets/1956/

1 голос
/ 08 сентября 2017

Если вы хотите иметь дело с логическими значениями, а не с целочисленными значениями, то это способ сделать это.

forms.TypedChoiceField(
    choices=((True, 'Yes'), (False, 'No')),
    widget=forms.RadioSelect,
    coerce=lambda x: x == 'True'
)
...