覆盖Django用户模型__unicode__

Dar*_*ryl 16 django-models

目前,Django 1.2.3用户模型unicode

def __unicode__(self):
    return self.username
Run Code Online (Sandbox Code Playgroud)

我想覆盖它,所以它:

def __unicode__(self):
    return u'%s, %s' % (self.last_name, self.first_name)
Run Code Online (Sandbox Code Playgroud)

如何?

为了类似的效果:

User._meta.ordering = ['last_name', 'first_name']
Run Code Online (Sandbox Code Playgroud)

定义时工作 anywhere

小智 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)
Run Code Online (Sandbox Code Playgroud)

  • 您可以在代码中的任何位置执行此操作,而不仅仅是管理站点. (2认同)

小智 5

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

这是我的解决方案:

form.fields['students'].queryset = Student.objects.filter(id__in = school.students.all())
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想在自定义方法中显示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)
Run Code Online (Sandbox Code Playgroud)

将这些代码添加到admin.py,它的工作原理.


Gab*_*iMe 0

如果您需要覆盖这些,您以后可能需要更多自定义。最干净的做法是使用用户配置文件模型而不是接触用户模型

  • 我确实理解配置文件模型的原理,但是,通常还需要稍微修改用户输出 (4认同)