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

vic*_*ass 11 python django django-admin

我有几个模型有User as Foreign Key.用户列表显示用户名,但我想自定义它.我是否必须使用自定义模型扩展用户模型并编写自己的__str__函数?有没有更简单的方法?我不认为你可以使用callable for fieldset,对吗?

Sur*_*ano 9

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

因为Python 2.x, __str__()方法将返回str(字节),__unicode__()方法将返回unicode(文本).

print语句和str内置调用,__str__()用于确定对象的人类可读表示.unicode内置调用( __unicode__()如果存在),否则将回退 __str__()并使用系统编码对结果进行解码.相反,示范基类派生自动__str__()__unicode__()通过编码为UTF-8. 在这里阅读完整

但是,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"
Run Code Online (Sandbox Code Playgroud)

解决方案:以相同的方式装饰,如上面针对您的类所做的那样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)
Run Code Online (Sandbox Code Playgroud)


Tod*_*dor 5

ForeignKeys在Django表单中以表示ModelChoiceFields。本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
Run Code Online (Sandbox Code Playgroud)