2012-04-03 2 views
7

Sto cercando di trovare un modo per visualizzare il testo del valore selezionato/iniziale di un campo a scelta multipla.Django: visualizza i valori del campo a scelta multipla selezionato in un modello

La mia domanda è simile a questo, tranne che non voglio il valorevoglio il testo opzione corrisponde a:

Display value of a django form field in a template?

Per esempio, se ho avuto un modulo con il seguente :

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

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

poi nel mio modello posso fare:

{{ form.genders.value }} 

per ottenere una matrice di opzioni selezionate (ad es. [u'male ', u'female']. Tuttavia, in qualche modo voglio guardare in alto il valore della stringa dal tasto (vale a dire "Uomini", "Donne"), qualcosa come:

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

non riesco a trovare un modo di fare questo lavoro. Come posso ottenere questo utilizzando Django 1.3?

ps - Questo è un piccolo esempio, ma ho bisogno di farlo con le liste dinamiche più grandi che vietano l'utilizzo di più se le dichiarazioni (cioè "se == chiave 'maschio' 'uomini' ... etc")

+1

Questo probabilmente potrebbe essere qualcosa del tipo: '{% per la chiave in form.genders.value%} {{ form.genders.get_key_display}} {% endfor%} 'Ma non sono nemmeno sicuro. – Mig

risposta

6
  1. Aggiungere un metodo per la forma, che restituisce la lista che si desidera

  2. chiamarlo dal modello

Ecco come si presenta:

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

In azione:

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'] 

Così si può semplicemente scorrere in questo modo:

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

FTR, ho usato:

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()] 

Puoi fare suc ha Filtro modello:

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

Usage:

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

Grazie per la risposta. C'è un modo in cui posso trasformare questo in un modello di tag o qualcosa del genere? Ho un sacco di campi che ho bisogno di fare questo e non voglio un metodo per campo ... – John

+1

Dovresti creare un filtro modello, è molto più semplice. – jpic

+0

OK, ci provo. Grazie – John