2010-12-01 9 views
148

Modelo:Django: Opción de pantalla Valor

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, consigo 'M' o 'F' en lugar de 'Masculino o femenino'. ¿Cómo se muestra el valor ('Hombre' o 'Mujer') en lugar del código (M/F)?

+4

posible duplicado de [valor de opciones de impresión Django] (http://stackoverflow.com/questions/ 4274243/django-print-choices-value) –

+0

Intenté este método, en mi plantilla estoy usando: {% para persona en object_list%} algún html {{person.get_gender_display()}} html {% endfor%} Soy Obtiene el siguiente error: Valor de excepción: \t No se pudo analizar el resto: '()' de 'person.get_ gender_display() ' – Shankze

+2

My Bad, no debería haber incluido'() 'after person.get_gender_display. Está funcionando ahora. Gracias. – Shankze

Respuesta

-50

me he mudado recientemente allá de Django, así que estoy más familiarizado con Jinja2 de plantillas, pero aquí vamos:

Tenga en cuenta que se almacena en la base de datos como 'M' y 'F'

Psuedo:

# Iterate through list of people 
    # Check if male 
    # output span w/ gender 

real:

{% for person in latest_person_list2 %} 
{% if person.gender == 'M' %} 
    <span>Male</span> 
{% else %} 
    <span>Female</span> 
{% endif %} 
{% endfor %} 

Para algo más compleja con más opciones de TI m Vale la pena escribir algo de lógica para buscar a través de la tupla CATEGORY_CHOICES de tuplas. A partir de ahora, con dos opciones para el género, no veo que ese sea el caso.

También ver: Django Template Tags

+40

No, esto no. –

+1

alas, parece que hay una función de conveniencia django para esto. echa un vistazo al comentario de arriba. – Devin

+0

Gracias Devin. Pero este es solo un ejemplo. Tengo otros casos en los que tengo más de 6 opciones. ¿Hay alguna alternativa a este método? – Shankze

344

Parece como si estuvieras en el camino correcto - get_FOO_display() es sin duda lo que quiere:

En las plantillas, que no incluyen() en el nombre de un método . Haga lo siguiente:

{{ person.get_gender_display }} 
+0

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

+0

No entiendo su solicitud. ¿Qué pasa con un método en el artículo? Si es así, entonces su sintaxis es correcta. Esta pregunta sobre la situación específica de tener opciones con nombre en un objeto Field. – jMyles

+7

Solo para tener en cuenta, para cualquier persona que use Jinja2 para sus plantillas, debe incluir los paréntesis. '{{person.get_gender_display()}}' –

-3

se puede utilizar en lugar de BooleanField CharField, y en el modelo:

BOOL_CHOICES = ((True, 'Male'), (False, 'Female')) 
gender = models.BooleanField(choices=BOOL_CHOICES) 
+3

¿Responde esto a la pregunta? – DylanYoung

Cuestiones relacionadas