development

Django BooleanField를 라디오 버튼으로 사용합니까?

big-blog 2020. 12. 31. 23:23
반응형

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

반응형