Отображать поле логической модели в форме Django в качестве переключателя, а не флажок по умолчанию
-
06-07-2019 - |
Вопрос
Вот как я это сделал, чтобы отобразить поле булевой модели в форме переключателей Да и Нет.
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
Как вы можете видеть из приведенного выше кода, мне нужен чистый метод, который преобразует входную строку в целое число, что может быть ненужным.
Есть ли лучший и / или джангический способ сделать это? Если да, то как?
И нет, использование BooleanField
, кажется, вызывает намного больше проблем. Использование этого казалось очевидным для меня; но это не так. Почему это так.
Решение
Используйте TypedChoiceField
.
class EmailEditForm(forms.ModelForm):
to_send_form = forms.TypedChoiceField(
choices=choices, widget=forms.RadioSelect, coerce=int
)
Другие советы
field = BooleanField(widget=RadioSelect(choices=YES_OR_NO), required=False)
YES_OR_NO = (
(True, 'Yes'),
(False, 'No')
)
Используйте это, если вы хотите горизонтальный рендер.
Если вы хотите иметь дело с логическими значениями, а не с целочисленными значениями, то это способ сделать это.
forms.TypedChoiceField(
choices=((True, 'Yes'), (False, 'No')),
widget=forms.RadioSelect,
coerce=lambda x: x == 'True'
)
Не связан с StackOverflow