58 votes

Django BooleanField en tant que boutons radio?

Y at-il un widget dans Django 1.0.2 pour rendre un models.BooleanField sous forme de deux boutons radio au lieu d’une case à cocher?

92voto

eternicode Points 2892

Django 1.2 a ajouté l'option Meta "widgets" pour les modelforms:

Dans votre models.py, spécifiez les "choix" pour votre champ booléen:

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

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

Ensuite, dans votre formulaire.py, spécifiez le widget RadioSelect pour ce champ:

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

J'ai testé cela avec une base de données SQLite, qui stocke également des booléens sous la forme de valeurs 1/0, et elle semble fonctionner correctement sans fonction de contrainte personnalisée.

66voto

Daniel Roseman Points 199743

Vous pouvez le faire en remplaçant la définition du champ dans 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
 

12voto

Kevin White Points 18

Dans Django 1.6, ce qui suit a fonctionné pour moi:

 class EmailSettingsForm(ModelForm):

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

5voto

funksta Points 90

Voici une fonction de contrainte rapide et sale utilisant lambda, qui contourne le "faux" -> vrai problème:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X