2010-07-02 17 views
27

Tengo un formulario en mi aplicación Django (no en administrador) que permite a los miembros seleccionar un usuario de un menú desplegable.Cambiar Django ModelChoiceField para mostrar los nombres completos de los usuarios en lugar de los nombres de usuario

forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False) 

El problema es que el menú desplegable muestra a los usuarios por los nombres de usuario, mientras que yo prefiero que muestran su nombre completo de user.get_full_name() y usamos nombre de usuario sólo si eso no está disponible. Realmente solo necesito este cambio en esta página, en otros lugares como administrador, no me importa si usa nombre de usuario.

¿Hay alguna manera de que pueda hacer esto?

Gracias!

Respuesta

53

Puede configurar un ModelChoiceField personalizado que le devolverá la etiqueta que desee.

Coloque algo así dentro de un fields.py o donde corresponda.

class UserModelChoiceField(ModelChoiceField): 
    def label_from_instance(self, obj): 
     return obj.get_full_name() 

Luego, cuando la creación de su forma, basta con utilizar ese campo

UserModelChoiceField(queryset=User.objects.filter(is_staff=False), required = False) 

Más información se puede encontrar here

+0

Gracias! Eso funcionó, pero no es forms.UserModelChoiceField es where_you_put_that_class.UserModelChoiceField – Adam

+0

Tiene razón, error de tipeo por mi parte :) ¡Lo arreglé! – Bartek

14

Cuando se trabaja con un ModelForm, me encontré con el siguiente más útil para que yo no No tengo que redefinir mi queryset, en particular porque utilicé limit_choices_to en la definición del modelo:

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     self.fields['user'].label_from_instance = lambda obj: "%s" % obj.get_full_name() 

personalizado de esta respuesta https://stackoverflow.com/a/7805824/432992

Cuestiones relacionadas