vic*_*ass 11 python django django-admin
我有几个模型有User as Foreign Key.用户列表显示用户名,但我想自定义它.我是否必须使用自定义模型扩展用户模型并编写自己的__str__函数?有没有更简单的方法?我不认为你可以使用callable for fieldset,对吗?
我认为__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)
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)
| 归档时间: |
|
| 查看次数: |
2184 次 |
| 最近记录: |