Y at-il un widget dans Django 1.0.2 pour rendre un models.BooleanField
que deux boutons radio au lieu d'une case à cocher?Django BooleanField comme boutons radio?
Répondre
Vous pouvez le faire en remplaçant la définition du champ dans la 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
Rappelez-vous aussi que MySQL utilise tinyint pour booléenne, donc Vrai/Faux sont en fait 1/0. J'ai utilisé cette fonction coerce:
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
Modifier la réponse de Daniel Roseman un peu, vous pouvez fixer le bool (« Faux ») = vrai problème de façon succincte en utilisant simplement ints à la place:
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
Cela ne fonctionne pas sur mon formulaire d'édition. La valeur actuelle du champ n'est pas extraite du modèle. J'ai utilisé la réponse d'eternicode à la place. – Dave
Voici un rapide & fonction coerce sale en utilisant lambda, qui obtient autour de la "Faux" -> vrai problème:
...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...
Django 1.2 a ajouté l'option Meta "widgets" pour 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 forms.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é ceci avec un DB SQLite, qui stocke également des booléens comme valeurs 1/0, et il semble fonctionner correctement sans une fonction de coercition personnalisée.
La solution la plus propre et la plus "Django" de loin. Merci! –
C'est génial. Je voudrais le modifier légèrement pour permettre des versions localisées de 'Oui' et 'Non' en utilisant 'from 'de django.utils.translation importer ugettext_lazy en tant que _' et mettre à jour' BOOL_CHOICES' être: 'BOOL_CHOICES = ((True, _ ('Oui')), (Faux, _ ('Non'))) ' – tatlar
Je pense que le code supplémentaire pour le localiser serait distraire du point. Un exercice pour le lecteur;) – eternicode
Comme il y a problème, en réponse Roseman @ Daniel, bool (« Faux ») -> Il est vrai que maintenant j'ai combiné deux réponses ici pour faire une solution.
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
Maintenant ceci fonctionne :)
Comme la réponse de @ eternicode, mais sans modifier le modèle:
class MyModelForm(forms.ModelForm):
yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])
class Meta:
model = MyModel
widgets = {'boolfield': yes_no}
Je pense que cela ne fonctionne que dans Django 1.2+
Une autre solution:
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)
Voici l'approche la plus simple que je pourrais trouver (j'utilise Django 1.5):
class MyModelForm(forms.ModelForm):
yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'),
(False, 'No')]))
Cela devrait être la bonne réponse. –
Vérification de cette solution fonctionne, mais voir la [note dans les docs] (https://docs.djangoproject.com/en/1.10/ref/forms/fields/#booleanfield). Vous devez définir required = False sur le terrain. – grokpot
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.')
])}
- 1. Django forme avec juste un BooleanField
- 2. Sélectionnez l'élément en ligne admin Django avec des boutons radio
- 3. Boutons radio HTML appelés boutons à bascule
- 4. jQuery plusieurs boutons radio
- 5. Boutons radio dans SSRS Rapport
- 6. Shorter façon de le faire - boutons radio
- 7. radio comme filtre recherche
- 8. Désactivation des boutons radio avec jQuery
- 9. Boutons radio MFC - Comportement DDX_Radio et DDX_Control
- 10. jQuery et groupes de boutons radio
- 11. boutons radio disparaissent dans IE et chrome
- 12. JQuery - créer de nouveaux boutons radio
- 13. les deux boutons radio peuvent être sélectionnés
- 14. boutons radio dans Grouper Zend Framework
- 15. Comment configurer les boutons radio dans Excel?
- 16. Afficher un champ modèle booléen sous forme de django comme un bouton radio plutôt que la valeur par défaut Checkbox
- 17. Rattachez rich: toggleControl aux boutons radio ou sélectionnez des éléments
- 18. Utilisation des images comme boutons?
- 19. Valeur des boutons radio avec les pages maîtres
- 20. Etiquettes pour boutons radio sous forme de rails
- 21. Peut sélectionner les deux boutons radio dans IE - C#
- 22. trier la liste des boutons radio dans ASP.NET
- 23. comment obtenir la valeur des boutons radio sélectionnés
- 24. La bonne façon de faire des boutons radio?
- 25. comment fonctionnent les boutons radio avec la liaison mvc asp.net
- 26. comment additionner les valeurs des boutons radio une seule fois?
- 27. Android: accès aux valeurs des boutons radio d'un service
- 28. Liste des boutons radio L'élément est toujours faux
- 29. Comment puis-je activer les boutons radio désactivés?
- 30. L'utilisation de "label for" sur les boutons radio
Malheureusement, cela ne fonctionne pas, parce que le coerce = bool reçoit une valeur de chaîne, et non la valeur booléenne et bool ("False") => True. J'ai donc dû écrire une fonction de coercition personnalisée pour prendre la valeur de chaîne et la convertir en bool, alors cela a fonctionné. Merci pour le pointeur. – dar
Devrait vraiment être mis à jour car, comme le note @dar, cela ne fonctionnera PAS puisque 'bool ('False')' => 'True'. –
@ Daniel, il ne fonctionne pas, bool ('Faux') renvoie True –