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')?

Shankze
fuente
44
posible duplicado del valor de las opciones de impresión
Ignacio Vazquez-Abrams
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
Posible duplicado de las plantillas
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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 }}
jMyles
fuente
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 ()

Muhammad Faizan Fareed
fuente
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

Daniel O'Brien
fuente