覆盖Django用户模型__unicode__

时间:2011-02-21 05:02:02

标签: django-models

目前,Django 1.2.3用户模型 unicode

def __unicode__(self):
    return self.username

我想覆盖它所以:

def __unicode__(self):
    return u'%s, %s' % (self.last_name, self.first_name)

如何?

达到类似的效果:

User._meta.ordering = ['last_name', 'first_name']

在定义anywhere

时有效

5 个答案:

答案 0 :(得分:36)

如果您只是想在管理界面中显示全名(这就是我需要的),您可以在运行时轻松地对其进行修补。只需在admin.py中执行类似的操作:

from django.contrib import admin
from django.contrib.auth.models import User

def user_unicode(self):
    return  u'%s, %s' % (self.last_name, self.first_name)

User.__unicode__ = user_unicode

admin.site.unregister(User)
admin.site.register(User)

答案 1 :(得分:5)

Django的代理模型解决了这个问题。

这是我的解决方案:

form.fields['students'].queryset = Student.objects.filter(id__in = school.students.all())

这里school.students是m2m(用户),Student是User的代理模型。

class Student(User):
    class Meta:
        proxy = True
    def __unicode__(self):
        return 'what ever you want to return'

以上所有内容可帮助您解决是否要在自定义方法中显示User ForeignKey的问题。如果您只想在管理视图中更改它,则有一个简单的解决方案:

def my_unicode(self):
    return 'what ever you want to return'

User.__unicode__ = my_unicode

admin.site.unregister(User)
admin.site.register(User)

将这些代码添加到admin.py,它可以正常工作。

答案 2 :(得分:0)

如果您需要覆盖这些,可能以后需要进行更多自定义。 最干净的做法是使用user profile models而不是触摸用户模型

答案 3 :(得分:0)

创建代理用户类。

class UserProxy(User):
    class Meta:
        proxy = True
        ordering = ['last_name', 'first_name']

    def __unicode__(self):
        return u'%s, %s' % (self.last_name, self.first_name)

答案 4 :(得分:0)

我刚刚在django 1.5上找到了这个简单的方法

def __unicode__(self):
   a = self.last_name
   b = self.first_name 
   c = a+ "-" +b
   return c 

它会返回你想要的东西