Это можно сделать несколькими способами.
Создайте прокси-подкласс User
и переопределите его метод __unicode__()
, чтобы вернуть полное имя пользователя.
class UserFullName(User):
class Meta:
proxy = True
def __unicode__(self):
return self.get_full_name()
Теперь в вашей модели формы, используйте UserFullName
для извлечения пользователей.
class BookForm(forms.ModelForm):
author = forms.ModelChoiceField(queryset=UserFullName.objects.all())
class Meta:
model = Book
Другой способ динамического заполнения выбор в конструкторе формы.
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
Пожалуй, самый "djangonic" способ демонстрируется lazerscience как ответ на аналогичный вопрос Django forms: how to dynamically create ModelChoiceField labels. Он подклассы ModelChoiceField
и переопределяет его метод label_from_instance()
, который предназначен для предоставления меток выбора.
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
Всегда указывайте свой класс модели в единственном числе, напишите 'Book' вместо' Books'. –
Возможный дубликат [Django forms: как динамически создавать метки ModelChoiceField] (http://stackoverflow.com/questions/2958792/django-forms-how-to-dynamically-create-modelchoicefield-labels) –