【问题标题】:How to display a user's get_full_name() instead of the username in a Django model form?如何在 Django 模型表单中显示用户的 get_full_name() 而不是用户名?
【发布时间】:2010-10-19 08:26:03
【问题描述】:

我有一个引用 ForeignKey(User) 字段的模型。

当用户在他的表单上选择一个项目时,我希望他们能够看到get_full_name() 而不仅仅是username

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

【问题讨论】:

标签: django django-forms


【解决方案1】:

这可以通过多种方式完成。

创建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

【讨论】:

  • 谢谢,最后一个选项(最“djangonic”的方式)似乎最干净并且工作正常。不要忘记from django.utils.encoding import smart_unicode
  • 谢谢你的回答你帮我解决了问题
【解决方案2】:

除了 Török Gábor 的回答之外,ModelMultipleChoiceFields 可以使用以下内容:

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,因此默认帮助文本('使用控件或命令选择多个...')。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2020-09-03
    • 2018-02-24
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多