Когда вы делаете срез непосредственно на объекте, 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" }}
В зависимости от того, что лучше всего подходит в вашем сценарии.
На самом деле одинДругой вариант - создать простой фильтр шаблона, который будет возвращать значение объекта в юникоде:
@register.filter
def get_unicode(obj):
return unicode(obj)
Затем в вашем шаблоне:
{{ list_object.content_object|get_unicode|slice:":20" }}
Разве вы не любите опции?;)