2012-04-28 5 views
1

こんにちは私は単純なウェブサイトを行うためにApp Engine/Pythonを使用しています。私はDjangoテンプレートの問題にいくつかの問題があります。Python/Django:Simple Django Template

要するに、 "ShortName"を使用して "LongName"にアクセスしたいとします。

soourceコード:

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

その後、私はテンプレートにこれら2つのパラメータを渡します。

私が書くテンプレートで:

{% 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']にアクセスしようとしています。

これを機能させるには、カスタムテンプレートタグ/フィルタを作成する必要があります。あなたはadding it to your app

{{ LongName|get:aname }} 

で使用することになり

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

register.filter(get) 

(SO GAE上でそれを行う方法を示して答えること):This Django bugは(WONTFIXをマーク)簡単な実装を持っています。あなたが本当にテンプレートタグを追加したくない場合は


また

# 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

ジャンゴテンプレートには欠点があります。私は前と同じ状況にいました。あなたがしなければならないことは、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のエントリを参照するより良い方法はありません。