Невозможно применить, чтобы нарезать свойство __unicode__ объекта в Django - PullRequest
0 голосов
/ 26 января 2012

У меня есть модель, в которой хранятся общие внешние ключи для разных объектов. Я отображаю список где-то и из-за ограниченного пространства я хочу склеить имя объекта.

Итак, я делаю следующее

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

но это не работает. Однако, когда я делаю

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

Нарезка работает. Однако я не могу использовать это, поскольку content_object является generic foreign key, и каждый объект не может иметь атрибут с именем title.

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Когда вы делаете срез непосредственно на объекте, 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" }}

Разве вы не любите опции?;)

1 голос
/ 26 января 2012

list_object.content_object - это объект, представленный строкой. Вы не можете нарезать объект, конечно. Чтобы решить вашу проблему, вы можете попытаться явно вызвать метод unicode :

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

Я этого не пробовал, но это будет мое первое предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...