¿Hay un widget en Django 1.0.2 para representar un models.BooleanField
como dos botones de opción en lugar de una casilla de verificación?Django BooleanField como botones de radio?
Respuesta
usted puede hacer esto cancelando la definición de campo en el 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
Asimismo, recuerda que MySQL utiliza tinyint de Boole, por lo Verdadero/Falso son en realidad 1/0. He utilizado esta función coaccionar:
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
Modificación de la respuesta de Daniel Roseman un poco, se puede fijar el bool ("falso") = True problema de forma sucinta sólo por el uso enteros en su lugar:
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
Esto no está funcionando en mi formulario de edición. El valor actual del campo no se extrae del modelo. Usé la respuesta de eternicode en su lugar. – Dave
Aquí hay una rápida & función de coaccionar sucia usando lambda, que se pone alrededor de la "falsa" -> el verdadero problema:
...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...
Django 1.2 ha añadido la opción de "widgets" Meta para modelforms:
En su models.py, especifique las "opciones" para su campo booleano:
BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))
class MyModel(models.Model):
yes_or_no = models.BooleanField(choices=BOOL_CHOICES)
Luego, en su forms.py, especifique el widget RadioSelect para ese campo:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'yes_or_no': forms.RadioSelect
}
He probado esto con un SQLite db, que también almacena booleanos como valores 1/0, y parece funcionar bien sin una función de coerción personalizada.
La solución más limpia y más "Django" y de lejos. ¡Gracias! –
Esto es genial. Lo modificaría ligeramente para permitir versiones localizadas de 'Sí' y 'No' usando 'from django.utils.translation import ugettext_lazy as _' y actualizando' BOOL_CHOICES' para que sea: 'BOOL_CHOICES = ((True, _ ('Sí')), (False, _ ('No'))) ' – tatlar
Creo que el código extra para localizarlo distraería del punto. Un ejercicio para el lector;) – eternicode
Como hay un problema en @Daniel Roseman answer, bool ('False') -> Es cierto, así que ahora he combinado dos respuestas aquí para hacer una solución.
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
Ahora bien, esto va a funcionar :)
Igual que la respuesta de @ eternicode, pero sin modificar el modelo:
class MyModelForm(forms.ModelForm):
yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])
class Meta:
model = MyModel
widgets = {'boolfield': yes_no}
creo que esto sólo funciona en Django 1.2+
Un otra solución:
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)
Este es el enfoque más simple que pude encontrar (estoy usando Django 1.5):
class MyModelForm(forms.ModelForm):
yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'),
(False, 'No')]))
Esta debería ser la respuesta correcta. –
Verificando que esta solución funciona, pero vea la [nota en los documentos] (https://docs.djangoproject.com/en/1.10/ref/forms/fields/#booleanfield). Necesita establecer required = False en el campo. – grokpot
En Django 1.6, los siguientes trabajó para mí:
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. Botones de radio en django Formularios
- 2. botones de radio AngularJS
- 3. Botones de radio Yii
- 4. Alinear los botones de radio horizontalmente en formularios django
- 5. jQuery - casillas de verificación como botones de radio
- 6. CakePHP crear botones de radio
- 7. Botones de radio grupo XAML
- 8. Como ir todos los botones de radio sin marcar
- 9. Barra de botones del objeto JQuery UI que funciona como botones de radio
- 10. Botones de radio HTML: ocultar viñetas
- 11. Mezcla botones de radio y text_field
- 12. Convención en Caliburn.Micro para botones de radio
- 13. Botones de radio "Comprobado" Atributo no funciona
- 14. jQuery Convert Seleccione los botones de Radio?
- 15. Lista de botones de radio con Knockout.js
- 16. Botones de radio + elementos de matriz
- 17. div palanca jQuery con botones de radio
- 18. Winforms Enlazar botones de Enum a Radio
- 19. Firefox recordando incorrectamente los botones de radio
- 20. mostrar botones de radio en una línea?
- 21. ¿Dos botones de radio comparten una "identificación"?
- 22. Tabbing entre botones de radio en VB6
- 23. Los botones de radio sobre rieles
- 24. Dos botones de radio ASP.NET C#
- 25. ¿Cuándo debo usar los botones de radio?
- 26. Javascript verificación botones de radio automáticamente
- 27. agrupar botones de radio en Zend Framework
- 28. Seleccionar un elemento en Django de administración en línea con los botones de radio
- 29. Android RadioGroup/RadioButtons dinámicos como botones planos
- 30. ¿Cómo usar setTextColor para los botones de radio de Android?
Desafortunadamente esto no funcionó, porque el coerce = bool se está pasando un valor de cadena, y no el valor booleano y bool ("False") => True. Así que tuve que escribir una función de coerción personalizada para tomar el valor de la cadena y convertir a bool, luego funcionó. Gracias por el puntero. – dar
Realmente debería actualizarse ya que, como notas @dar, esto en realidad NO funcionará desde 'bool ('False')' => 'True'. –
@Daniel, no funciona, bool ('False') devuelve True –