2012-08-28 30 views
28

¿Hay alguna manera (sin usar un formulario) de acceder al valor de 'opciones' de un campo modelo?Acceda al field.choices de Django

quiero hacer algo como field.choices - y obtener la lista de valores, ya sea en una vista o una plantilla

Respuesta

3

Creo que busca get_fieldname_display() función.

34

Claro, solo acceda al atributo choice de un campo Modelo.

MyModel._meta.get_field('foo').choices 
my_instance._meta.get_field('foo').choices 
+0

¿Qué pasa si yo quería en mis plantillas de Django? –

+1

Todo lo accesible en su vista es accesible en la plantilla, solo necesita pasarlo al contexto de la plantilla. Como este comienza con un guión bajo, tendrá que pasar manualmente la instancia de campo al contexto. –

+0

¡perfecto! Exactamente lo que he estado tratando de buscar en la fuente lol .. – Amyth

4

Si está declarando sus opciones de la siguiente manera:

class Topic(models.Model): 

    PRIMARY = 1 
    PRIMARY_SECONDARY = 2 
    TOPIC_LEVEL = ((PRIMARY, 'Primary'), 
        (PRIMARY_SECONDARY, 'Primary & Secondary'),) 

    topic_level = models.IntegerField('Topic Level', choices=TOPIC_LEVEL, 
      default=1) 

que es una buena manera de hacerlo realidad. Ver: http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/

entonces se puede obtener de vuelta las opciones simplemente con Topic.TOPIC_LEVEL

+0

Lo estoy usando de esta manera, pero en lugar de obtener 'Primary, Primary & Secondary' (como debería ser, en el ejemplo anterior) obtengo' (PRIMARY, 'Primary'), (PRIMARY_SECONDARY, 'Primary & Secundario ') '. ¿Por qué es eso y cómo solucionarlo? –

+1

@LjubisaLivac La razón es que ha declarado la variable 'TOPIC_LEVEL' como una tupla de pares' (database_value, 'readable_value') 'y ahora la está recuperando exactamente como la ha ingresado. Hay muchas ventajas al hacerlo, una de ellas es la legibilidad para la siguiente persona que maneje su código. Esto no está roto: muchas aplicaciones preferirían tener el valor real de la base de datos en lugar del que los humanos deben leer. Si solo quiere las cadenas, puede recuperarlas con '[i [1] for i en Topic.TOPIC_LEVEL]'. –

Cuestiones relacionadas