Cela peut être fait de plusieurs façons.
Créer une sous-classe proxy de User
et remplacer sa méthode __unicode__()
pour renvoyer le nom complet de l'utilisateur.
class UserFullName(User):
class Meta:
proxy = True
def __unicode__(self):
return self.get_full_name()
Maintenant, dans votre modèle de formulaire, utilisez UserFullName
pour récupérer les utilisateurs.
class BookForm(forms.ModelForm):
author = forms.ModelChoiceField(queryset=UserFullName.objects.all())
class Meta:
model = Book
Une autre façon est de remplir dynamiquement des choix dans le constructeur de forme.
class BookForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BookForm, self).__init__(*args, **kwargs)
users = User.objects.all()
self.fields['author'].choices = [(user.pk, user.get_full_name()) for user in users]
class Meta:
model = Book
Peut-être, la façon la plus "djangonic" est démontrée par lazerscience comme une réponse à la question similaire Django forms: how to dynamically create ModelChoiceField labels. Il sous-classe ModelChoiceField
et remplace sa méthode label_from_instance()
qui est destinée à fournir des étiquettes de choix.
class UserFullnameChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return smart_unicode(obj.get_full_name())
class BookForm(forms.ModelForm):
author = UserFullnameChoiceField(queryset=User.objects.all())
class Meta:
model = Book
Toujours nommer votre classe de modèle au singulier, écrivez 'Book' au lieu de' Books'. –
duplication possible de [formulaires Django: comment créer dynamiquement des étiquettes ModelChoiceField] (http://stackoverflow.com/questions/2958792/django-forms-how-to-dynamically-create-modelchoicefield-labels) –