pelicula - Opción "Deshabilitado" para choiceField-Django
django wikipedia (6)
Tengo problemas con una simple pregunta: ¿Cómo tener un campo "deshabilitado" en un menú desplegable generado a través de un modelForm y choiceFied en el Framework django?
Por el momento, no puedo averiguar cómo obtener tal salida: - Entrada de la raíz 1 - (deshabilitada) - Elt 1 - (no deshabilitada) - Entrada de la raíz 2 - (deshabilitada)
Tienes algún consejo ?
Pierre
¿Está intentando crear un menú en el que los elementos de la lista se separan en categorías y no desea que las categorías sean seleccionables?
Si es así, puede lograr esto haciendo que su plantilla renderice el campo utilizando etiquetas, por ejemplo,
<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>
Esta podría ser una respuesta tardía pero esta es una versión simplificada que se puede modificar utilizando la instancia del formulario.
Puede pasar una lista de valores para deshabilitar, es decir,
def __init__(self, disabled_choices, *args, **kwargs):
self.disabled_choices = disabled_choices
O
from django.forms import Select
class SelectWidget(Select):
"""
Subclass of Django''s select widget that allows disabling options.
"""
def __init__(self, *args, **kwargs):
self._disabled_choices = []
super(SelectWidget, self).__init__(*args, **kwargs)
@property
def disabled_choices(self):
return self._disabled_choices
@disabled_choices.setter
def disabled_choices(self, other):
self._disabled_choices = other
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
option_dict = super(SelectWidget, self).create_option(
name, value, label, selected, index, subindex=subindex, attrs=attrs
)
if value in self.disabled_choices:
option_dict[''attrs''][''disabled''] = ''disabled''
return option_dict
Para deshabilitar una opción basada en una condición, es decir, el usuario no es un superusuario.
class MyForm(forms.Form):
status = forms.ChoiceField(required=True, widget=SelectWidget, choices=Status.choices())
def __init__(self, request, *args, **kwargs):
if not request.user.is_superuser:
self.fields[''status''].widget.disabled_choices = [1, 4]
super().__init__(*args, **kwargs)
Parece que django 1.1 permitirá "optgroup": documentación de Django
class MyForm(forms.Form):
some_field = forms.ChoiceField(choices=[
(''Audio'', (
(''vinyl'', ''Vinyl''),
(''cd'', ''CD''),
)
),
(''Video'', (
(''vhs'', ''VHS Tape''),
(''dvd'', ''DVD''),
)
),
(''unknown'', ''Unknown''),
])
Este imho es una necesidad.
Puede crear opciones como Bryan menciona de esta manera. En las siguientes opciones, Root 1, Root 2 se deshabilitan automáticamente y se verán como las Opciones de grupo
CHOICES = (
(''-- Root 1--'',
(
(''ELT1'', ''ELT1''),
(''ELT2'', ''ELT2''),
(''ELT3'', ''ELT3''),
)
),
(''-- Root 2--'',
(
(''ELT3'', ''ELT3''),
(''ELT4'', ''ELT4''),
)
),
)
La opción anterior se mostrará de esta manera. En la imagen de abajo, la Raíz 1 y la Raíz 2 no son seleccionables.
Espero que esto solucione tu problema
-Vikram
Los widgets de formulario de Django ofrecen una forma de pasar una lista de atributos que deben representarse en la etiqueta <option>
:
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 funcionará para usted porque el atributo se aplicará a CADA etiqueta de opción que se representa. Django no tiene manera de saber automáticamente qué debería estar habilitado y cuál debería estar deshabilitado.
En tu caso, te recomiendo escribir un widget personalizado. Es bastante fácil de hacer, y no tienes mucha lógica personalizada para aplicar. Los documentos sobre esto están here . En resumen, aunque:
-
forms.Select
subclase.forms.Select
, que es el procesador de selección predeterminado - en su subclase, implemente el método
render(self, name, value, attrs)
. Use su lógica personalizada para determinar si elvalue
califica como que necesita ser deshabilitado. Eche un vistazo a la muy corta implementación derender
endjango/forms/widgets.py
si necesita inspriation.
Luego, define tu campo de formulario para usar tu widget personalizado:
class MyForm(forms.Form):
some_field = forms.ChoiceField(choices=my_choices,
widget=MyWidget)
field_choices = (
('''',''Make choice''),
(1,''first''),
(2,''second''),
(3,''third'')
)
from django.forms import Select
class Select(Select):
def create_option(self, *args,**kwargs):
option = super().create_option(*args,**kwargs)
if not option.get(''value''):
option[''attrs''][''disabled''] = ''disabled''
if option.get(''value'') == 2:
option[''attrs''][''disabled''] = ''disabled''
return option