Django - 用户全名为unicode

时间:2012-08-10 13:04:49

标签: python django django-models django-users

我有许多模型链接到User,我希望我的模板总是显示他的full_name(如果可用)。有没有办法更改默认User __unicode__()?或者还有另一种方法吗?

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


想象一下,我需要显示此对象的表单

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

我必须选择每个对象__unicodes__的方框,不是吗? 如何在用户名中使用全名?

4 个答案:

答案 0 :(得分:19)

试试这个:

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

ALSO

如果必须替换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 

答案 1 :(得分:2)

如果您有个人资料模型set up as Django suggests,则可以在该模型上定义全名

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

或者,如果您只需要模板中的全名,则可以编写simple tag:

@register.simple_tag
def fullname(user):
    return "%s %s" % (user.first_name, user.last_name)

答案 2 :(得分:1)

只需将get_full_name方式抨击__unicode__即可

User.__unicode__ = User.get_full_name

确保使用callable覆盖它,而不是函数的结果。 User.get_full_name()将因打开和关闭括号而失败。

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

答案 3 :(得分:0)

我发现在Django 1.5中有一个快速的方法。检查一下: custom User models

我也注意到了,

User.__unicode__ = User.get_full_name()
弗朗西斯Yaconiello提到的不是我的工作(Django 1.3)。会引发这样的错误:

TypeError: unbound method get_full_name() must be called with User instance as first argument (got nothing instead)