2009-03-23 17 views
15

Tengo problemas con una simple pregunta: ¿Cómo se tiene un campo "deshabilitado" en un menú desplegable generado a través de un modeloFormulario y se eligeFied en el Framework django?Opción "Desactivado" para choiceField - Django

Por el momento, no puedo encontrar la manera de obtener una salida como: - Raíz 1 entrada - (desactivado) - Elt 1 - (no discapacitados) - Raíz 2 de entrada - (deshabilitado)

¿Tiene algún consejo?

Pierre

Respuesta

16

forma de widgets de Django ofrecen una manera de pasar una lista de atributos que deben ser prestados en el <option> etiqueta:

my_choices = (('one', 'One'), ('two', 'Two')) 
class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=my_choices, 
            widget=forms.Select(attrs={'disabled':'disabled'})) 

Desafortunadamente, esto no va a funcionar para usted porque se aplica el atributo a CADA etiqueta de opción que se representa. Django no tiene manera de saber automáticamente cuál debería estar habilitado y cuál debería ser deshabilitado.

En su caso, le recomiendo que escriba un widget personalizado. Es bastante fácil de hacer, y no tienes tanta lógica personalizada para aplicar. Los documentos sobre esto son here. En resumen, aunque:

  • subclase forms.Select, que es el selecto procesador predeterminado
  • en la subclase, poner en práctica el método render(self, name, value, attrs). Use su lógica personalizada para determinar si el value califica como necesario deshabilitar. Eche un vistazo a la implementación muy corta de render en django/forms/widgets.py si necesita una certificación.

Entonces, definir el campo de la forma de usar el widget personalizado:

class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=my_choices, 
            widget=MyWidget) 
+1

Esta es una muy buena solución, pero el método adecuado para cambiar los atributos de las opciones 'se render_option() '' no se rinde() '(que representa todo el widget) – jnns

3

¿Estás tratando de crear un menú en el que los elementos de la lista se dividen en categorías, y no quiere que los mismos sean seleccionables categorías?

Si es así, puede lograrlo haciendo que su plantilla muestre el campo usando etiquetas, p. Ej.

<select name="my_field" id="id_my_field"> 
<optgroup label="-- Root 1 entry --"> 
    <option value="1">Elt 1</option> 
    <option value="2">Elt 2</option> 
    <option value="3">Elt 3</option> 
</optgroup> 
<optgroup label="--- Root 2 entry ---"> 
    <option value="4">Elt 4</option> 
    <option value="5">Elt 5</option> 
</optgroup> 
</select> 
4

Parece Django 1.1 permitirá "optgroup": Django documentation

class MyForm(forms.Form): 
    some_field = forms.ChoiceField(choices=[ 
     ('Audio', (
       ('vinyl', 'Vinyl'), 
       ('cd', 'CD'), 
      ) 
     ), 
     ('Video', (
       ('vhs', 'VHS Tape'), 
       ('dvd', 'DVD'), 
      ) 
     ), 
     ('unknown', 'Unknown'), 
    ]) 

Esto en mi humilde opinión es una necesidad.

4

Puede crear opciones como las mencionadas por Bryan de esta manera. En las siguientes opciones de raíz 1, 2 Raíz son automáticamente desactivada y que se verá como Opciones de grupo

CHOICES = (
    ('-- Root 1--', 
     (
     ('ELT1', 'ELT1'), 
     ('ELT2', 'ELT2'), 
     ('ELT3', 'ELT3'), 
    ) 
    ), 
    ('-- Root 2--', 
     (
     ('ELT3', 'ELT3'), 
     ('ELT4', 'ELT4'), 
    ) 
), 
) 

La opción anterior mostrará como este. En la imagen de abajo, Root 1 y Root 2 no son seleccionables.

enter image description here

Esperanza Esto borrará su problema

-Vikram

Cuestiones relacionadas