Django: visualizza il valore della scelta


246

models.py:

class Person(models.Model):
    name = models.CharField(max_length=200)
    CATEGORY_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    gender = models.CharField(max_length=200, choices=CATEGORY_CHOICES)
    to_be_listed = models.BooleanField(default=True)
    description = models.CharField(max_length=20000, blank=True)

views.py:

def index(request):
    latest_person_list2 = Person.objects.filter(to_be_listed=True)
    return object_list(request, template_name='polls/schol.html',
                       queryset=latest_person_list, paginate_by=5)

Sul modello, quando chiamo person.gender, ottengo 'M'o 'F'invece di 'Male'o 'Female'.

Come visualizzare il valore ( 'Male'o 'Female') invece del codice ( 'M'/ 'F')?



Ho provato questo metodo, Nel mio modello sto usando: {% per persona in object_list%} un po 'di html {{person.get_gender_display ()}} html {% endfor%} sto ottenendo il seguente errore: Valore di eccezione: Impossibile analizzare il resto: '()' da 'person.get_gender_display ()'
Shankze il

7
Mio cattivo, non avrei dovuto includere '()' dopo person.get_gender_display. Sta lavorando adesso. Grazie.
Shankze,

3
Solo un piccolo commento, dal momento che il genere sarà solo M o F (lunghezza di 1 carattere), non ha senso impostare la lunghezza massima del campo 200. Con max_lenght=1è abbastanza, renderai il tuo sito più efficiente e ti assicurerai di non avere dati errati. :)
Alejandro Garcia,

Risposte:


503

Sembra che tu fossi sulla buona strada - get_FOO_display()è sicuramente quello che vuoi:

Nei modelli , non includere ()nel nome di un metodo. Eseguire le seguenti operazioni:

{{ person.get_gender_display }}

Questo metodo non ha prezzo. Ma a parte l'uso del metodo, qual è il modo per recuperare il valore memorizzato in dire {{i.item.what_to_put_here}}?
KhoPhi,

11
Solo per notare, per chiunque utilizzi Jinja2 per i propri modelli, è necessario includere le parentesi. {{ person.get_gender_display() }}
Adamo b

1
Punti bonus: qual è il modo migliore per farlo se invii le tue informazioni tramite JSON (ad esempio in uno scenario di impaginazione)? Idealmente senza il sovraccarico di creare un'istanza dei Modelli uno per uno e chiamare get_field_display ().
DylanYoung,

7
Devi amare Django, quasi 10 anni dopo e la risposta è ancora valida! Grazie +1 e bevi su di me.
Marc,

1
In qualche modo questo non recupera il testo tradotto. Qualche idea su come ottenere il testo tradotto se i18 è già implementato sul sito Web?
Anoop Nair,

16

Per ogni campo che ha delle scelte impostate, l'oggetto avrà un metodo get_FOO_display (), dove FOO è il nome del campo. Questo metodo restituisce il valore "leggibile dall'uomo" del campo.

In Views

person = Person.objects.filter(to_be_listed=True)
context['gender'] = person.get_gender_display()

Nel modello

{{ person.get_gender_display }}

Documentazione di get_FOO_display ()


1

Altri hanno sottolineato che un metodo get_FOO_display è ciò di cui hai bisogno. Sto usando questo:

def get_type(self):
    return [i[1] for i in Item._meta.get_field('type').choices if i[0] == self.type][0]

che scorre su tutte le scelte di un determinato elemento fino a quando non trova quello corrispondente al tipo di elemento

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.