2011-09-02 21 views
14

En los documentos, nullbooleanfield está representado as a <select> box with "Unknown", "Yes" and "No" choices. ¿Cómo puedo cambiar los valores de select a algunos otros textos más significativos y asignarlos de nuevo a los valores sí, no y desconocidos en mi modelform?django: cómo cambiar los valores para nullbooleanfield en un modelo?

Por ejemplo, tengo yes_no_required = models.NullBooleanField() y me gustaría tener 'yes I acknowledge this', 'no, I do not like this' y 'I do not know now' mapeo para sí, no y requiere en consecuencia.

Respuesta

29

pasé media hora armar una demostración sólo para demostrar a mí mismo que esto funciona:

CHOICES = (
    (None, "I do not know now"), 
    (True, "Yes I acknowledge this"), 
    (False, "No, I do not like this") 
) 

class Demo(models.Model): 
    yes_no_required = models.NullBooleanField(choices = CHOICES) 

class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 

me miraba en el código fuente de Django. Todo puede aceptar una matriz de opciones. Obviamente, para algunos de los que no tiene sentido, pero es posible.

+3

Parece que Django agrega otra opción para Null al FormFi opciones de campo, ya que el null-attr se establece como verdadero. Tendría que pasar las opciones también a FormField, para limitarlo a estas opciones y no a una opción nula punteada adicional. – codingjoe

+0

Esto parece no funcionar más. 'TypeError: __init __() obtuvo un argumento de palabra clave inesperado 'choices'' –

3

Puede manejar esto de una forma (withouth modificando los modelos) así:

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace, 
     choices=CHOICES), 
    label='...', 
    required=False) 

Creo que es una mala idea usar NullBooleanField para los datos que pueden estar en tres estados como: sí/no/desarmado

Editando los datos funciona. Pero el gran problema surge si desea escribir un formulario de búsqueda para esta información.

A continuación, los valores de "vacío" puede tener dos significados:

  • no me importa para este atributo. Incluir todas las filas
  • Incluir solo estas filas, donde la columna es NULA.

La solución es simple: utilice un campo ChoiceField.

Más detalles aquí: https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

Puede modificar su widget de campo en su ModelForm clase meta:

CHOICES = (
      (None, "I do not know now"), 
      (True, "Yes I acknowledge this"), 
      (False, "No, I do not like this"), 
      ) 
class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 
     fields = ("demo_field",) 
     widgets = { 
       'demo_field': forms.RadioSelect(choices = CHOICES), 
        } 
1

enfoque simple sería cambiar opciones del widget en su forma:

class YourForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs) 
     new_choices = ((1, 'I do not know now'), 
         (2, 'Yes I acknowledge this'), 
         (3, 'No, I do not like this')) 
     self.fields['your_field'].widget.choices = new_choices 
Cuestiones relacionadas