2010-10-23 2 views
1

Я разрабатываю проект в Google AppEngine, используя шаблоны Django, поэтому для печати содержимого в моем HTML-шаблоне я должен использовать теги, например {{ aitem.Author }}.Как отличить списки от строк в шаблонах django

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

Автор: [u'J. К. Роулинг», u'Mary GrandPr \ xE9' ]

Есть ли способ справиться с таким сценарием (в основном печать поля по-разному в зависимости от его типа) эффективно? Должен ли я полагаться на пользовательские теги или любые другие средства?

ответ

6

Я думаю, что самым чистым решением было бы добавить метод к модели get_authors(), которая всегда возвращает список одного или нескольких авторов. Затем вы можете использовать:

Author: {{ aitem.get_authors|join:", " }} 

Если вы по какой-то причине есть только доступ к шаблонам и не может изменить модель, то вы можете использовать хак вроде этого:

{% if "[" == aitem.Author|pprint|slice:":1" %} 
    Author: {{ aitem.Author|join:", " }} 
{% else %} 
    Author: {{ aitem.Author }} 
{% endif %} 

P.S. это не является хорошим соглашением использовать заглавные буквы для имен атрибутов.

+0

Вы правы, но, к сожалению, я не могу изменить модель для этого: я использую библиотеку и не могу легко изменить эту вещь. Это объясняет именованные свойства. – abahgat

+2

Вместо 'pprint', лучше не проверять тип конкретного метода? Например. 'if author.islower' оценивает только true, если строка. –

+0

Хорошая идея. Я об этом не думал. –

1

Я думаю, что решение AAidas является лучшим, но альтернативой может быть создание тега шаблона, который выполняет тест. Вы захотите прочитать на custom template tags, но их не так сложно создать, если вы посмотрите на существующие.

0

Я следил за советом Мэтью и в конечном итоге реализовал фильтр для обработки списков. Я отправляю его здесь на случай, если кому-то это понадобится.

@register.filter(name='fixlist') 
def fixlist(author): 
    if type(author) == list: 
     return ', '.join(author) 
    else: 
     return author 

Я называю это из шаблонов страниц, как этот {{ aitem.Author|fixlist }}

Спасибо за помощь!

+1

Скорее всего, hipper сказать 'if isinstance (автор, список):' – dbn