form - django widgets




Django BooleanField als Optionsfelder? (7)

Bedenken Sie auch, dass MySQL Tinyint für Boolean verwendet, also ist True / False tatsächlich 1/0. Ich habe diese Zwangsfunktion benutzt:

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

Gibt es ein Widget in Django 1.0.2, um ein models.BooleanField als zwei Optionsfelder anstelle einer Checkbox zu rendern?


Da gibt es ein Problem in @Daniel Roseman Antwort, bool ('False') -> True, also habe ich hier zwei Antworten kombiniert, um eine Lösung zu machen.

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

Jetzt wird das funktionieren :)


Eine andere Lösung:

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)

Hier ist der einfachste Ansatz, den ich finden könnte (ich benutze Django 1.5):

class MyModelForm(forms.ModelForm):
    yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'), 
                                                            (False, 'No')]))

In Django 1.6 funktionierte folgendes für mich:

class EmailSettingsForm(ModelForm):

    class Meta:
        model = EmailSetting
        fields = ['setting']
        widgets = {'setting': RadioSelect(choices=[
            (True, 'Keep updated with emails.'),
            (False, 'No, don\'t email me.')             
        ])}

Sie können dies tun, indem Sie die Felddefinition in ModelForm überschreiben:

class MyModelForm(forms.ModelForm):
    boolfield = forms.TypedChoiceField(
                   coerce=lambda x: x == 'True',
                   choices=((False, 'False'), (True, 'True')),
                   widget=forms.RadioSelect
                )

    class Meta:
         model = MyModel

Wie @ternicodes Antwort, aber ohne das Modell zu ändern:

class MyModelForm(forms.ModelForm):
    yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])

    class Meta:
        model = MyModel
        widgets = {'boolfield': yes_no}

Ich denke, das funktioniert nur in Django 1.2+





django-forms