2010-03-05 6 views
5

¿Hay alguna manera fácil de hacerlo?Establecer el atributo de opciones de campo del modelo en tiempo de ejecución?

+0

Por curiosidad, ¿cuál es su caso de uso para esto? –

+0

Estoy tratando de sacar la lista de opciones de la base de datos. También estoy usando la traducción, y no puedo etiquetar la cadena para la traducción ya que están en la base de datos. –

+0

¿Están estas opciones expuestas a los usuarios o solo para lógica interna? Me pregunto si esto es algo que puede manejarse a nivel de formularios, ya que es mucho más común construir elecciones dinámicas allí. Cambiar las elecciones en el nivel del modelo parece frustrar el propósito de establecer elecciones en el modelo en primer lugar. Tal vez esto se puede abordar de una manera diferente? –

Respuesta

2

Puede configurar las opciones atribuyen a cualquier iterable: http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.choices

No he probado esto por mí mismo así que no estoy seguro de que cuando las opciones atributo es en realidad evaluados, pero que puede ser capaz de asignar un generador función que calcularía tus elecciones deseadas.

También puede investigar el uso de la señal Modelo post_init: http://docs.djangoproject.com/en/1.1/ref/signals/#post-init

Esto le dará acceso a su modelo después de Django ha inicializado y por lo que podría configurar las opciones en ese momento. Probablemente quiera pasar por la interfaz "_meta" de la siguiente manera:

instance._meta.get_field_by_name('FIELD_NAME')[0].choices = [<choices>...] 
+0

Eso casi funcionó. Puedo ver las opciones actuales, pero si intento establecer un valor diferente, aparece el error: AttributeError: no se puede establecer el atributo. –

+1

Al buscar en la fuente de los campos, puede ver que "elecciones" es una propiedad de solo lectura: http://code.djangoproject.com/browser/django/tags/releases/1.1.1/django/db/models /fields/__init__.py#L296 Intenta establecer en "_choices" en su lugar. Esto funciona en el caparazón, pero no daré ninguna garantía sobre las consecuencias involuntarias. –

+0

¡SÍ! Funciona para mi. Gracias un montón. –

1

Establezca las opciones in __init__().

+0

Lo siento, no estaba claro. Me refería a establecer/cambiar el atributo de opciones después de que se haya inicializado un modelo. –

Cuestiones relacionadas