2012-04-03 16 views
7

Estoy tratando de encontrar una forma de mostrar el texto del valor seleccionado/inicial de un campo de opción múltiple.Django: Muestra los valores del campo de selección múltiple seleccionado en una plantilla

Mi pregunta es similar a éste, excepto que no quiero el valorQuiero el texto de la opción que corresponde a:

Display value of a django form field in a template?

Por ejemplo, si tuviera un formulario con la siguiente :

GENDER_CHOICES = (
    ('male', _('Men')), 
    ('female', _('Women')), 
) 

genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, 
    widget=widgets.CheckboxSelectMultiple(), 
    initial=[gender[0] for gender in GENDER_CHOICES]) 

entonces en mi plantilla que puede hacer:

{{ form.genders.value }} 

para obtener una matriz de opciones seleccionadas (es decir [u'male ', u'female']. Sin embargo, de alguna manera quiero para buscar el valor de la cadena de la clave (es decir, "Mujeres" "Hombres"), algo así como:

{% for key in form.genders.value %} 
    {{ form.genders.choices.key }} 
{% endfor %} 

no puedo encontrar una manera de hacer este trabajo. ¿Cómo puedo lograr esto usando Django 1.3?

ps - Este es un ejemplo corto, pero tengo que hacerlo con grandes listas dinámicas que prohíben el uso de múltiples sentencias if (es decir, "si == clave 'masculina' 'hombres' ... etc")

+1

Probablemente esto podría ser algo como: '{% para la clave en form.genders.value%} {{ form.genders.get_key_display}} {% endfor%} 'Pero tampoco estoy seguro. – Mig

Respuesta

6
  1. añadir un método para la forma, que devuelve la lista que desea

  2. llamaremos a partir de la plantilla

Parece que este:

def selected_genders_labels(self): 
    return [label for value, label in self.fields['genders'].choices if value in self['genders'].value()] 

en acción:

In [1]: from testapp.views import XForm; f = XForm(initial={'genders': ['male', 'female']}); print f.selected_genders_labels() 
['Men', 'Women'] 

In [2]: from testapp.views import XForm; f = XForm(initial={'genders': ['female']}); print f.selected_genders_labels() 
['Women'] 

In [3]: from testapp.views import XForm; f = XForm(initial={'genders': []}); print f.selected_genders_labels() 
[] 

In [4]: from testapp.views import XForm; f = XForm(); print f.selected_genders_labels() 
['Men', 'Women'] 

lo que sólo puede repetir de esta manera:

{% for label in form.selected_genders_labels %}{{ label }}{% endfor %} 

FTR, he utilizado:

class XForm(forms.Form): 
    GENDER_CHOICES = (
     ('male', 'Men'), 
     ('female', 'Women'), 
    ) 

    genders = forms.MultipleChoiceField(choices=GENDER_CHOICES, 
     widget=widgets.CheckboxSelectMultiple(), 
     initial=[gender[0] for gender in GENDER_CHOICES]) 

    def selected_genders_labels(self): 
     return [label for value, label in self.fields['genders'].choices if value in self['genders'].value()] 

Puedes hacer que tu ja filtro de plantilla:

@register.filter 
def selected_labels(form, field): 
    return [label for value, label in form.fields[field].choices if value in form[field].value()] 

Uso:

{% for label in form|selcted_labels:"genders" %} 
    {{ label }} 
{% endfor %} 
+0

Gracias por su respuesta. ¿Hay alguna manera de convertir esto en una etiqueta de plantilla o algo así? Tengo muchos campos para los que necesito hacer esto y realmente no quiero un método por campo ... – John

+1

En su lugar, debe hacer un filtro de plantilla, es mucho más fácil. – jpic

+0

OK Voy a intentarlo. Gracias – John

Cuestiones relacionadas