2012-04-28 3 views
1

Привет, я использую App Engine/Python для создания простого веб-сайта. У меня проблемы с проблемой шаблона Django.Python/Django: простой шаблон Django

Короче говоря, я хочу использовать «ShortName» для доступа к «LongName».

Код soource:

LongName={"so":"stackoverflow","su":"superuser"} 
ShortName=['so','su'] 

Тогда я прохожу эти два параметра в шаблонах.

В шаблоне я пишу:

{% for aname in ShortName %} 
{{ aname }} stands for {{ LongName.aname }}, 
{% endfor %} 

Выход: не дается

so stands for, su stands for 

Нет ошибок. LongName.aname не будет работать.

Я понятия не имею, что случилось.

+1

Мне кажется, что ваше объявление LongName имеет ненужную и непревзойденную одиночную кавычку. Это действительно в вашем коде, или это просто опечатка в вашем вопросе? –

+0

@Adam это опечатка. Ред. –

ответ

5

Это попытка получить доступ к LongName['aname'], а не LongName[aname].

Возможно, вам придется написать собственный шаблонный тег/фильтр, чтобы заставить его работать. This Django bug (отмечен WONTFIX) имеет простую реализацию:

def get(d, key): 
    return d.get(key, '') 

register.filter(get) 

, который вы будете использовать на

{{ LongName|get:aname }} 

после adding it to your app (что SO ответ показывает, как сделать это на GAE).


Вы также можете предварительно сделать переменную перебираем в представлении, передав

# in view 
name_abbrevs = [(k, LongName[k]) for k in ShortName] 

# in template 
{% for short_name, long_name in name_abbrevs %} 
    {{ short_name }} stands for {{ long_name }} 
{% endif %} 

Если вы действительно не хотите добавить тег шаблона - который не так уж плохо! вы просто делаете один файл! :) - или передать дополнительную переменную, Vic's approach позволит вам сделать это, не касаясь файлов Python. Как он упоминает, он включает в себя много бессмысленной итерации, но он будет отлично работать для небольших списков.

+1

Большое спасибо! Идея добавить что-то к исходному коду просто пугает меня. У меня нет опыта возиться с исходным кодом. –

+0

Вы действительно отредактировали свой ответ, чтобы использовать мой ответ? Вам нужно найти лучший способ провести выходные. –

+0

@VicFryzel Huh? Мои измененные дополнения не используют ваш подход (без вложенных циклов).Я, очевидно, ссылаюсь на ваш ответ в конце и рассказываю о том, как он относится к другим подходам, которые я предлагал. – Dougal

2

Шаблоны Django имеют недостаток здесь. Раньше я был в той же ситуации. Что вам нужно сделать, это перебрать все ключи в LongName и проверить, соответствует ли ключ, который вы ищете, ShortName. Здесь вы идете:

{% for aname in ShortName %} 
    {% for short_version, long_version in LongName %} 
    {% if aname == short_version %} 
     {{ aname }} stands for {{ long_version }}, 
    {% endif %} 
    {% endfor %} 
{% endfor%} 

Это неэффективно, и, по сути бессмысленным O (N^2) механизм. Тем не менее, нет лучшего способа в чистых шаблонах Django ссылаться на записи dict по имени переменной.

Смежные вопросы