2012-04-28 3 views
1

안녕하세요, 간단한 웹 사이트를 만들기 위해 App Engine/Python을 사용하고 있습니다. 장고 템플릿 문제에 약간의 문제가 있습니다.Python/Django : Simple Django 템플릿

요약하면 "LongName"에 액세스하기 위해 "ShortName"을 사용하고 싶습니다.

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']에 액세스하려고합니다.

이 기능을 사용하려면 맞춤 템플릿 태그/필터를 작성해야 할 수 있습니다.

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

register.filter(get) 

당신이 (SO 쇼에 대답하는 방법을 GAE에 그것을 수행하는 것을) adding it to your app

{{ LongName|get:aname }} 

으로 사용합니다 : (고치지 않을 것 (wontfix) 표시) This Django bug은 간단한 구현을 가지고있다. 당신이 정말로 템플릿 태그를 추가하지 않으려면


또한

# 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을 전달하면 파이썬 파일을 전혀 건드리지 않고도이 작업을 수행 할 수 있습니다. 그가 언급 하듯이, 그것은 무의미한 반복을 필요로하지만, 작은 목록에서는 잘 작동합니다.

+1

고마워요! 소스 코드에 무언가를 추가한다는 아이디어는 단지 나를 겁주는 것입니다. 나는 소스 코드를 엉망으로 만든 경험이 없다. –

+0

내 대답을 사용하기 위해 답을 실제로 편집 했습니까? 주말을 보내는 더 좋은 방법을 찾아야합니다. –

+0

@VicFryzel 응? 편집 된 추가 기능은 접근 방식을 사용하지 않습니다 (중첩 루프 없음).나는 분명히 마지막에 당신의 대답에 연결하고 그것이 제안한 다른 접근법과 어떻게 관련이 있는지 이야기합니다. – Dougal

2

장고 템플릿에는 여기에 단점이 있습니다. 나는 전에 같은 상황에 있었어. 당신이해야 할 일은 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의 항목을 참조하는 더 좋은 방법은 없습니다.