Django: Mostrar valor de elección


245

modelos.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)

En la plantilla, cuando llamo person.gender, obtengo 'M'o en 'F'lugar de 'Male'o 'Female'.

¿Cómo mostrar el valor ( 'Male'o 'Female') en lugar del código ( 'M'/ 'F')?



Probé este método. En mi plantilla estoy usando: {% para la persona en object_list%} algunos html {{person.get_gender_display ()}} html {% endfor%} Recibo el siguiente error: Valor de excepción: No se pudo analizar el resto: '()' de 'person.get_gender_display ()'
Shankze

77
Lo malo, no debería haber incluido '()' después de person.get_gender_display. Está funcionando ahora. Gracias.
Shankze

3
Solo un pequeño comentario, ya que el género solo será M o F (longitud de 1 carácter) no tiene sentido establecer la longitud máxima del campo de char en 200. Con max_lenght=1es suficiente, hará que su sitio sea más eficiente y se asegurará de que no tenga datos incorrectos. :)
Alejandro Garcia

Respuestas:


502

Parece que estabas en el camino correcto, get_FOO_display()sin duda es lo que quieres:

En las plantillas , no se incluye ()en el nombre de un método. Haz lo siguiente:

{{ person.get_gender_display }}

Este método no tiene precio. Pero aparte de usar el método, ¿cuál es la forma de recuperar el valor almacenado en digamos, {{i.item.what_to_put_here}}?
KhoPhi

11
Solo para tener en cuenta, para cualquiera que use Jinja2 para sus plantillas, debe incluir los paréntesis. {{ person.get_gender_display() }}
adam b

1
Puntos de bonificación: ¿cuál es la mejor manera de hacer esto si envía su información a través de JSON (por ejemplo, en un escenario de paginación)? Idealmente sin la sobrecarga de instanciar los Modelos uno por uno y llamar a get_field_display ().
DylanYoung

77
¡Tengo que amar a Django, casi 10 años después y la respuesta sigue siendo válida! Thx +1 y bebe conmigo.
Marc

1
De alguna manera, esto no recupera el texto traducido. ¿Alguna idea sobre cómo obtener el texto traducido si i18 ya está implementado en el sitio web?
Anoop Nair

16

Para cada campo que tenga opciones establecidas, el objeto tendrá un método get_FOO_display (), donde FOO es el nombre del campo. Este método devuelve el valor "legible para humanos" del campo.

En vistas

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

En plantilla

{{ person.get_gender_display }}

Documentación de get_FOO_display ()


1

Otros han señalado que lo que necesita es un método get_FOO_display. Estoy usando esto:

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

que itera sobre todas las opciones que tiene un elemento en particular hasta que encuentra el que coincide con el tipo de elemento

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.