2011-09-26 12 views
5

私は以下の作業をしようとしています。ループ変数をDjangoテンプレートの辞書キーとして使用する

カウントループはすべての値に対してループスルーする必要があり、ユーザーは各カウントに関連付けられていない可能性がありますが、カウント値iはJavaScriptに渡すために各ループで使用する必要があります。

Pythonの一部:

users = {} 
users[1]={} 
users[1][id]=... 
users[1][email]=... 

... 

count=[1,2,3,4,5,6,7,8,9,10] 

Djangoテンプレートパーツ:

{% for i in count %} 
do some stuff with the value i using {{i}} which always returns the value, i.e. 1 

email:{% if users.i.email %}'{{users.i.email}}'{% else %}null{% endif%} 
{% endfor %} 

これは、電子メールのために何も返しません。 {% if user.i.email %}iの代わりに番号1を入力すると、ユーザーの電子メールアドレスが返されます。 私はJavaScriptでデータを使用しているので、存在しない場合は暗黙的にnullにする必要があります。 私はDjangoに値iの代わりに変数としてi変数を認識させるように見えません。

それは私が "with" 文

{% for i in count %}{% with current_user=users.i %}... 

、その後current_user.emailを使用してを使用してみましたが、何も

を返されていない無効な構文エラー

email:{% if users.[i].email %}'{{users.[i].email}}'{% else %}null{% endif%} 

をスローするよう[]を使用すると、動作しません。

も試してみました

{% for i in count %}{% with j=i.value %}... 

それがうまくいく場合に備えて、jを使用しようとしましたが、同じ結果です。

ユーザーオブジェクトをループし、キー/値と等しいかどうかをチェックするインナーforループを作成することを考えましたが、高価でスケーラビリティに欠けます。

Djangoを変数として表示するようにDjangoを強制する方法はありますか?それはインデックスとしての価値ですか、それとも他の方法でこれを回避するのですか?

おかげ

Jayd

* 編集:以下、Abhiによって示唆されているように

私は、ループのための余分を試してみました。

{% for i in count %} 
    {% for key, current_user in users.items %} 
     do some stuff with the value i using {{i}} which always returns the value, i.e. 1 
     email:{% if i == key and current_user.email %}'{{current_user.email}}'{% else %}null{% endif%} 
    {% endfor %} 
{% endfor %} 

この種類の作品ですが、今ではユーザーのすべての価値に対してdo some stuff with the value iを繰り返します。 ifを入れた場合:

カウントに特定のユーザーがない場合は、ループが無視されます。

私がこれを見ることができる唯一の方法は、それぞれの場所でユーザーループを使用してcurrent_userを使用することです。

{% for i in count %} 
     do some stuff with the value i using {{i}} which always returns the value, i.e. 1 
     email:{% for key, current_user in users.items %}{% if i == key and current_user.email %}'{{current_user.email}}'{% else %}null{% endif%}{% endfor %} 
{% endfor %} 

これは非常に高価なようです。 アイデア

私は多分キーとしてiを使用して、ユーザーの値を返すフィルター書くことを考えていました:

{% with current_user=users|getuser:i %} 

をしかし、ここで、これは動作する場合、私は知らないか、私は同じエラーを取得しますiが変数名の代わりに値 'i'として渡されています。

私はそれほど長く試してみます。

* 編集

これは動作しませんでした。 フィルターは{{}}を使用して処理しましたが、{% %} の内部では機能しませんでした。入力

+1

を試してみてください、リストや辞書のいずれかでJaydコードを使用可能にしますか –

+0

編集ボックスの右側に明確な書式プロンプトを表示するのではなく、この質問全体で**太字の書式設定を使用したのはなぜですか? –

+0

書式設定の謝罪、投稿をしたときにプロンプ​​トが表示されませんでした。 – Jayd

答えて

1

私の周りの仕事として、以下が出ている:

これは、フィルタコードである:ここで

@register.filter(name='dict_value_or_null') 
def dict_value_or_null(dict, key): 
    if key in dict: 
     return dict[key] 
    else: 
     return 'null' 

ので、これはうまく機能テンプレートコード

{% for i in count %} 
     do some stuff with the value i using {{i}} which always returns the value, i.e. 1 
     email:'{{users|dict_value_or_null:i|dict_value_or_null:'email'}}' 
{% endfor %} 

です私は私の解決策を持っていると思います。しかし、{%%}の中の値をリテラルではなく変数として扱う方法がテンプレートシステムにあったとすれば、これはもっと簡単にできたと思います。

これを行う方法はありますか?

入力

+0

あなたが探している答えではないかもしれませんが、テンプレートエンジン用のJinja2を見てください。これはDjangoにかなりよく似ていますが、構文は非常に似ていますが、テンプレートでPythonのような構文を使うことができるようになると少し上手くなります(IMHO)。 –

+0

ありがとうございます。私はそれを確認します。 – Jayd

1

ため

おかげで、このお試しください:

{% for key,val in user.items %} 
ID is {{ val.id }} and Email is {{ val.email }} 
{% endfor %} 
+0

注 - 索引iにアクセスするために、辞書「ユーザー」を先頭に、ユーザー[i]を使用しています。ユーザーにアクセスしようとすると、辞書名が一致するようにしてください。アイテム – Abhi

+0

この返答いただきありがとうございます。はい、これは、私が話していた周りのループです。これはコードで機能していますが、ループでループを必要としない代わりに、ユーザーオブジェクトをiで呼び出す方法はありますか? – Jayd

+0

ユーザーとユーザーのコメントありがとうございます。私は戻ってそれを変更しました。 – Jayd

9

をジョーは彼のコメントで言うように、辞書は明らかに外容器の間違ったデータ構造です。あなたはリストを使用しているはずです。

users = [] 
user = {'id':..., 'email': ...} 
users.append(user) 

...

{% for user in users %} 
    {{ user.email }} 
{% endfor %} 

あなたがループ内の各ユーザーの数が必要な場合は、{{ forloop.counter }}を使用することができます。

+0

カウントが1になるようにする必要があります。なぜなら、別のカウントリストを使用していて、関連するユーザーがいないカウントも存在するからです。したがって、2人のユーザーしかいない可能性があります。カウント番号6〜8回でループして他の作業を行う必要があります。 – Jayd

+0

@Jaydまだユーズケースを完全に理解しているかどうかは不明ですが、これは問題の前に置くのが良いと思われる詳細なので、あなたが解決しようとしている実際の問題を知っています。 –

1

のおかげでは、なぜあなたは、外側収集のための辞書の代わりのリストを使用していますか?この

@register.filter(name='dict_value_or_null') 
def dict_value_or_null(dict, key): 
    try: 
     return dict[key] 
    except: 
     return 'null' 
関連する問題