8

我有很多模型链接到User,我希望我的模板总是显示他的全名(如果有的话)。有没有办法改变默认值User __unicode__()?还是有其他方法可以做到这一点?

我注册了一个配置文件模型,我可以在其中定义__unicode__(),我应该将我的所有模型链接到它吗?对我来说似乎不是一个好主意。


想象一下我需要显示这个对象的表单

class UserBagde
    user = model.ForeignKey(User)
    badge = models.ForeignKey(Bagde)

我将不得不选择__unicodes__每个对象的框,不是吗?
我怎样才能在用户的名字中有全名?

4

4 回答 4

21

试试这个:

User.full_name = property(lambda u: u"%s %s" % (u.first_name, u.last_name))

编辑

显然你想要的已经存在..

https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.get_full_name

如果必须替换 unicode 函数:

def user_new_unicode(self):
    return self.get_full_name()

# Replace the __unicode__ method in the User class with out new implementation
User.__unicode__ = user_new_unicode 

# or maybe even
User.__unicode__ = User.get_full_name()

如果名称字段为空,则回退

def user_new_unicode(self):
    return self.username if self.get_full_name() == "" else self.get_full_name()

# Replace the __unicode__ method in the User class with out new implementation
User.__unicode__ = user_new_unicode 
于 2012-08-10T13:14:44.760 回答
3

如果您按照 Django 的建议设置了配置文件模型,则可以在该模型上定义全名

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    ...

@property
def full_name(self):
    return "%s %s" % (self.user.first_name, self.user.last_name)

然后在您可以访问user对象的任何地方都可以轻松完成user.get_profile.full_name

或者,如果您只需要模板中的全名,您可以编写一个简单的标签:

@register.simple_tag
def fullname(user):
    return "%s %s" % (user.first_name, user.last_name)
于 2012-08-10T13:10:55.560 回答
1

像这样猛烈抨击get_full_name这种__unicode__方法

User.__unicode__ = User.get_full_name

确保用可调用的而不是函数的结果覆盖它。User.get_full_name()将因左括号和右括号而失败。

放在任何包含的文件上,你应该会很好。

于 2016-03-16T16:59:07.553 回答
0

我发现在 Django 1.5 中有一个快速的方法来做到这一点。检查这个: 自定义用户模型

我也注意到,

User.__unicode__ = User.get_full_name()

Francis Yaconiello 的哪些方法对我不起作用(Django 1.3)。会引发这样的错误:

TypeError: unbound method get_full_name() must be called with User instance as first argument (got nothing instead)
于 2012-11-19T04:31:51.900 回答