2010-07-02 9 views
27

J'ai un formulaire dans mon application Django (pas dans l'admin) qui permet aux membres du personnel de sélectionner un utilisateur à partir d'une liste déroulante.Changer Django ModelChoiceField pour afficher les noms complets des utilisateurs plutôt que des noms d'utilisateur

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

Le problème est que le menu déroulant montre aux utilisateurs par les noms d'utilisateur alors que je préfère le montrer leur nom complet de user.get_full_name() et utilise le nom d'utilisateur que si ce n'est pas disponible. Je n'ai vraiment besoin de ce changement sur cette page, dans d'autres endroits comme admin, je m'en fous si elle utilise un nom d'utilisateur.

Y a-t-il un moyen de le faire?

Merci!

Répondre

53

Vous pouvez configurer un ModelChoiceField personnalisé qui renverra l'étiquette que vous souhaitez.

Placez quelque chose comme ceci dans un fields.py ou n'importe où applicable.

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

Ensuite, lors de la création de votre formulaire, il suffit d'utiliser ce champ

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

Plus d'informations peuvent être trouvées here

+0

Merci! Cela a fonctionné, mais ce n'est pas forms.UserModelChoiceField c'est where_you_put_that_class.UserModelChoiceField – Adam

+0

Vous avez raison, typo de ma part :) Je l'ai réparé! – Bartek

14

Lorsque vous travaillez avec un ModelForm, j'ai trouvé ce qui suit le plus utile pour que je didn Je n'ai pas besoin de redéfinir mon jeu de requête - en particulier parce que j'ai utilisé limit_choices_to dans la définition du modèle:

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

personnalisée à partir de cette réponse https://stackoverflow.com/a/7805824/432992