django - 如何在 Django 模型表单中显示用户的 get_full_name() 而不是用户名?

标签 django django-forms

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

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

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

最佳答案

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

创建 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 展示了最“djangonic”的方式,作为对类似问题的回答 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

关于django - 如何在 Django 模型表单中显示用户的 get_full_name() 而不是用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3966483/

相关文章:

python - 签名中的显式参数不起作用?很奇怪

django - 在 django admin 中添加指向内联项目的完整更改表单的链接?

Django:验证多个字段

python - 如何在 Django 中自定义 related_name 参数

python - 在 App Engine 上使用 djangoforms 进行唯一值验证

django - wkhtmltopdf 始终使用默认的无衬线字体

django - 更改最终用户的 postgres 密码

python - 使用 Django 在另一台服务器上创建 PostgreSQL 数据库

python - 如何编写适用于Python 2和Python 3的代码?

python - 无法分配 django.utils.functional.SimpleLazyObject,必须是用户实例