2012-07-11 21 views
6

estoy trabajando en algunas formas de Django. Un campo es ForeignKey en el modelo, por lo que se representa como ModelChoiceField en el formulario. El ModelChoiceField actualmente utiliza el método del modelo __unicode__ para rellenar la lista, que no es mi comportamiento deseado. Me gustaría poder utilizar otro método del modelo. A partir de los documentos, parece que puedo forzar mi propia QuerySet, pero no puedo ver cómo esto podría ayudarme a utilizar un método distinto __unicode__.Uso método distinto __unicode__ en ModelChoiceField Django

Realmente preferiría evitar divorciarse de esto desde los métodos de formulario por defecto, si es posible.

¿Alguna sugerencia?

Respuesta

1

No es tanto un conjunto de consultas a medida, pero la conversión de su queryset a una lista. Si usted acaba de hacer choices=some_queryset Django toma las decisiones en la forma de:

(item.pk, item.__unicode__()) 

Así que hágalo usted mismo con una lista por comprensión:

choices=[(item.pk, item.some_other_method()) for item in some_queryset] 
+0

Gracias. Muy útil. – TimD

10

Puede anular label_from_instance para especificar un método diferente:

from django.forms.models import ModelChoiceField 

class MyModelChoiceField(ModelChoiceField): 

    def label_from_instance(self, obj): 
     return obj.my_custom_method() 

a continuación, puede utilizar este campo en el formulario en su lugar. Este método está destinado a ser anulado en subclases. Aquí está la fuente original en django.forms.models:

# this method will be used to create object labels by the QuerySetIterator. 
# Override it to customize the label. 
def label_from_instance(self, obj): 
    """ 
    This method is used to convert objects into strings; it's used to 
    generate the labels for the choices presented by this object. Subclasses 
    can override this method to customize the display of the choices. 
    """ 
    return smart_unicode(obj) 
Cuestiones relacionadas