Django BooleanField를 라디오 버튼으로 사용합니까?
Django 1.0.2에 models.BooleanField
확인란 대신 두 개의 라디오 버튼으로 렌더링하는 위젯이 있습니까?
ModelForm에서 필드 정의를 재정 의하여이를 수행 할 수 있습니다.
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(
coerce=lambda x: x == 'True',
choices=((False, 'False'), (True, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Django 1.2는 모델 폼에 대한 "위젯"메타 옵션을 추가했습니다.
models.py에서 부울 필드의 "선택 사항"을 지정하십시오.
BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))
class MyModel(models.Model):
yes_or_no = models.BooleanField(choices=BOOL_CHOICES)
그런 다음 forms.py에서 해당 필드에 대한 RadioSelect 위젯을 지정하십시오.
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'yes_or_no': forms.RadioSelect
}
부울을 1/0 값으로 저장하는 SQLite db로 이것을 테스트했으며 사용자 지정 강제 함수 없이도 잘 작동하는 것 같습니다.
Daniel Roseman의 대답을 약간 수정하면 대신 int를 사용하여 bool ( "False") = True 문제를 간결하게 수정할 수 있습니다.
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(coerce=lambda x: bool(int(x)),
choices=((0, 'False'), (1, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Django 1.6에서는 다음이 저에게 효과적이었습니다.
class EmailSettingsForm(ModelForm):
class Meta:
model = EmailSetting
fields = ['setting']
widgets = {'setting': RadioSelect(choices=[
(True, 'Keep updated with emails.'),
(False, 'No, don\'t email me.')
])}
다음은 내가 찾을 수있는 가장 간단한 방법입니다 (Django 1.5를 사용하고 있습니다).
class MyModelForm(forms.ModelForm):
yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'),
(False, 'No')]))
다음은 "False"-> True 문제를 해결하는 람다를 사용하는 빠르고 더러운 강제 함수입니다.
...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...
@eternicode의 답변과 동일하지만 모델을 수정하지 않습니다.
class MyModelForm(forms.ModelForm):
yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])
class Meta:
model = MyModel
widgets = {'boolfield': yes_no}
Django 1.2 이상에서만 작동한다고 생각합니다.
또한 MySQL은 Boolean에 tinyint를 사용하므로 True / False는 실제로 1/0입니다. 이 강제 기능을 사용했습니다.
def boolean_coerce(value):
# value is received as a unicode string
if str(value).lower() in ( '1', 'true' ):
return True
elif str(value).lower() in ( '0', 'false' ):
return False
return None
@Daniel Roseman 답변에 문제가 있으므로 bool ( 'False')-> True, 이제 여기에 두 가지 답변을 결합하여 하나의 솔루션을 만들었습니다.
def boolean_coerce(value):
# value is received as a unicode string
if str(value).lower() in ( '1', 'true' ):
return True
elif str(value).lower() in ( '0', 'false' ):
return False
return None
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(coerce= boolean_coerce,
choices=((False, 'False'), (True, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
이제 작동합니다 :)
다른 해결책 :
from django import forms
from django.utils.translation import ugettext_lazy as _
def RadioBoolean(*args, **kwargs):
kwargs.update({
'widget': forms.RadioSelect,
'choices': [
('1', _('yes')),
('0', _('no')),
],
'coerce': lambda x: bool(int(x)) if x.isdigit() else False,
})
return forms.TypedChoiceField(*args, **kwargs)
참조 URL : https://stackoverflow.com/questions/854683/django-booleanfield-as-radio-buttons
'development' 카테고리의 다른 글
Bash에서 두 파일을 교환하는 가장 짧은 방법 (0) | 2020.12.31 |
---|---|
50 % 불투명도 배경 위에 100 % 불투명도 UILabel (UIView?) (0) | 2020.12.31 |
UICollectionView : 스크롤이 중지되었을 때 감지하는 방법 (0) | 2020.12.31 |
목록에서 중복을 제거하는 방법은 무엇입니까? (0) | 2020.12.31 |
UIPageViewController에서 점 숨기기 (0) | 2020.12.31 |