2010-07-02 9 views
27

Ho un modulo nella mia app Django (non nell'admin) che consente ai membri dello staff di selezionare un utente da un menu a discesa.Cambia Django ModelChoiceField per mostrare i nomi completi degli utenti anziché i nomi utente

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

Il problema è che la discesa mostra agli utenti di nomi utente mentre io preferirei che mostrare il loro nome completo da user.get_full_name() e utilizzare il nome utente solo se questo non è disponibile. Ho davvero bisogno di questa modifica su questa pagina, in altri posti come l'amministratore, non mi interessa se usa il nome utente.

C'è un modo per farlo?

Grazie!

risposta

53

È possibile impostare un numero personalizzato ModelChoiceField che restituirà l'etichetta desiderata.

Inserire qualcosa di simile all'interno di un fields.py o dove applicabile.

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

Poi durante la creazione del modulo, è sufficiente utilizzare quel campo

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

Maggiori informazioni si possono trovare here

+0

Grazie! Ha funzionato, ma non è forms.UserModelChoiceField è ovunque where_you_put_that_class.UserModelChoiceField – Adam

+0

Hai ragione, errore di battitura da parte mia :) L'ho risolto! – Bartek

14

Quando si lavora con un ModelForm, ho trovato il seguente più utile in modo che io didn Devo ridefinire il mio queryset, in particolare perché ho usato limit_choices_to nella definizione del modello:

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() 

personalizzato da questa risposta https://stackoverflow.com/a/7805824/432992

Problemi correlati