如何在用作外键时更改Django Admin中的用户表示?

时间:2016-06-28 21:02:48

标签: python django django-admin

我有一些使用User作为外键的模型。用户列表显示用户名,但我想自定义用户名。我是否必须使用自定义模型扩展User模型并编写自己的__str__函数?有没有更简单的方法? 我认为你不能使用可调用的字段集,对吗?

4 个答案:

答案 0 :(得分:9)

我认为__unicode__()方法不正确,您应该使用__str__()方法。

对于Python 2.x__str__()方法将返回str(字节),__unicode__()方法将返回unicode(文本)。

  

print语句和str内置调用__str__()来确定   对象的人类可读表示。内置的unicode   如果它存在,则调用__unicode__(),否则返回   __str__()并使用系统编码对结果进行解码。相反,Model基类自动从中派生__str__()   __unicode__()编码为UTF-8。   read here complete

但在Python 3.x中只有__str__(),没有__unicode__()方法。

  

Django提供了一种定义__str__()__unicode__()的简单方法   适用于Python 2和3的方法:您必须定义__str__()   返回文本并应用python_2_unicode_compatible()的方法   装饰器。

     

在Python 3上,装饰器是一个无操作器。在Python 2上,它定义了   适当的__unicode__()__str__()方法(替换   该过程中的原始__str__()方法。)

以下是django docs的一个例子。

from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(object):
    def __str__(self):
        return "Instance of my class"

解决方案:以同样的方式进行装饰,如上所述为您的Class和 在models.py中,添加一个将添加到用户模型的方法。

from django.contrib.auth.models import User

def get_name(self):
    return '{} {}'.format(self.first_name, self.last_name)

User.add_to_class("__str__", get_name)

答案 1 :(得分:3)

您可以通过覆盖用户def custom_user_display(self): return self.email + ', ' self.first_name # write your representation here User.add_to_class("__unicode__", custom_user_display) # override the __unicode__ method 方法来更改Django默认用户的字符串表示形式。在应用中的某处添加代码,可能在models.py

test

答案 2 :(得分:3)

假设您有这样的模型

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True, verbose_name=_('user'), related_name='profile')
    city = models.CharField(max_length=128, null=True, blank=True)

你想在管理页面中显示用户的电子邮件而不是用户名或用户ID,那么你可以做这样的事情

class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('get_user', 'city')

    def get_user(self, obj):
        return obj.user.email
    get_user.short_description = 'User'
    get_user.admin_order_field = 'user__id'

答案 3 :(得分:3)

Django表单中的

ForeignKeysModelChoiceFields表示。 ModelChoiceField类具有label_from_instance方法,该方法决定如何呈现选择。因此,为了在Admin中更改此表示,您需要修改此表单字段。

这是一个简单的例子。

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        field = super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
        if db_field.name == "user":
            field.label_from_instance = lambda u: "My Object #%i" % u.id
        return field