无法应用于在Django中切片对象的__unicode__属性

时间:2012-01-26 14:38:48

标签: django django-templates

我有一个模型,它将通用外键存储到不同的对象。我在某处显示列表,由于空间限制,我想拼接对象名称。

所以我正在做以下

{{list_object.content_object|slice:":20"}}

但这不起作用。但是当我做的时候

{{list_object.content_object.title|slice:":20"}}

切片工作。但是我不能使用它,因为content_objectgeneric foreign key,并且每个对象都没有名为title的属性。

请帮忙!

2 个答案:

答案 0 :(得分:2)

当您直接对对象进行切片时,Django从不调用__unicode__,而是直接将对象传递给过滤器。这是应该发生的实际行为。当您在模板中执行{{ some_object }}时,Django只会自动为您调用__unicode__,因为它需要打印某些内容

最好的办法是在模型中添加一个方法以提供缩短的名称,然后在模板中使用该方法:

def MyModel(models.Model):
    ...
    def get_short_content_title(self):
        return unicode(self.content_object)[:20]

在你的模板中:

{{ list_object.get_short_content_title }}

或者从技术上讲,您只需代理__unicode__电话,然后在模板中处理它,无论您想要:

def MyModel(models.Model):
    def get_content_title(self):
        return unicode(self.content_object)

在你的模板中:

{{ list_object.get_content_title|slice:":20" }}

无论哪种情况最适合您的情景。

实际上还有一种替代方法是创建一个简单的模板过滤器来返回对象的unicode值:

@register.filter
def get_unicode(obj):
    return unicode(obj)

然后,在您的模板中:

 {{ list_object.content_object|get_unicode|slice:":20" }}

你不喜欢选择吗? ;)

答案 1 :(得分:1)

list_object.content_object是一个对象,由字符串表示。当然,你不能切片对象。要解决您的问题,您可以尝试明确地调用 unicode 方法:

{{list_object.content_object.__unicode__|slice:":20"}}

我没试过,但这是我的第一次猜测。