Django BooleanField als Optionsfelder?


4 Answers

Django 1.2 hat die Meta-Option "Widgets" für Modellformen hinzugefügt:

Geben Sie in Ihrem models.py die "Auswahlmöglichkeiten" für Ihr boolesches Feld an:

BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))

class MyModel(models.Model):
    yes_or_no = models.BooleanField(choices=BOOL_CHOICES)

Geben Sie dann in Ihrer forms.py das RadioSelect-Widget für dieses Feld an:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'yes_or_no': forms.RadioSelect
        }

Ich habe dies mit einer SQLite-Datenbank getestet, die auch boolesche Werte als 1/0-Werte speichert, und es scheint ohne eine benutzerdefinierte Zwangsfunktion zu funktionieren.

Question

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




Hier ist eine schnelle & schmutzige Zwangsfunktion mit Lambda, die das "False" -> True-Problem umgeht:

...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...



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)



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.')             
        ])}





Related