Django покажет get_full_name () вместо или имя пользователя в форме модели - PullRequest
14 голосов
/ 19 октября 2010

У меня есть модель, которая ссылается на поле ForeignKey(User).

Когда пользователь выбирает элемент в своей форме, я бы хотел, чтобы он мог видеть get_full_name() вместо username.

class Books(models.Model):
     author = models.ForeignKey(User)

Ответы [ 2 ]

34 голосов
/ 19 октября 2010

Это можно сделать несколькими способами.

Создайте подкласс прокси 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

Пожалуй, самый «джангонический» способ продемонстрирован lazerscience как ответ на похожий вопрос Формы Django: как динамически создавать метки ModelChoiceField Он подклассов 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
0 голосов
/ 25 ноября 2011

В дополнение к ответу Тёрока Габора, для ModelMultipleChoiceField s можно использовать следующее:

class UserFullnameMultipleChoiceField(ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return smart_unicode(obj.get_full_name())

class BookForm(forms.ModelForm):
    authors = UserFullnameMultipleChoiceField(queryset=User.objects.all(),
                                              help_text=Book.authors.field.help_text)

Обратите внимание, что у меня есть копия help_text, поэтому текст справки по умолчанию («Использовать элемент управления или команду для выбора нескольких ...»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...