質問

Google App Engine と Django テンプレートを使用しています。
次のようなオブジェクトを表示したいテーブルがあります。

Object Result:
    Items = [item1,item2]
    Users = [{name='username',item1=3,item2=4},..]

Django テンプレートは次のとおりです。

<table>
<tr align="center">
    <th>user</th>
    {% for item in result.items %}
        <th>{{item}}</th>
    {% endfor %}
</tr>

{% for user in result.users %}
    <tr align="center"> 
        <td>{{user.name}}</td>
        {% for item in result.items %}
            <td>{{ user.item }}</td>
        {% endfor %}
    </tr>
{% endfor %}
</table>

今、 ジャンゴのドキュメント を見たとき、 . 変数内
データを取得するためにいくつかのことを試みますが、そのうちの 1 つは辞書検索です。これはまさに私が望んでいることですが、起こらないようです...

役に立ちましたか?

解決

変数が最も素晴らしい方法ではないようにするための「より良い」/「より良い」ソリューションを見つけましたが、それは機能します。

パラメータとして辞書のキーを取得するカスタムフィルターをジャンゴにインストールします

Google App-Engineで機能させるには、メインディレクトリにファイルを追加する必要があります。 django_hack.py この小さなコードが含まれています

from google.appengine.ext import webapp

register = webapp.template.create_template_register()

def hash(h,key):
    if key in h:
        return h[key]
    else:
        return None

register.filter(hash)

このファイルができたので、あとはそれを使用するようにアプリ エンジンに指示するだけです。これを行うには、この小さな行をメイン ファイルに追加します。

webapp.template.register_template_library('django_hack')

そして、テンプレートビューに、通常のコードの代わりにこのテンプレートを追加します

{{ user|hash:item }}

そしてそれは完全に動作するはずです =)

他のヒント

機能しない部分は次のとおりだと思います {{ user.item }}.

Django は辞書検索を試みますが、文字列を使用します。 "item" の値ではなく、 item ループ変数。Django は解決時に同じことをしました {{ user.name }}name の属性 user という変数を探すのではなく、オブジェクトを検索します。 name.

テンプレートでレンダリングする前に、ビュー内のデータの前処理を行う必要があると思います。

または、次のようにテンプレートの属性を解決するために使用されるデフォルトの django システムを使用することもできます。

from django.template import Variable, VariableDoesNotExist
@register.filter
def hash(object, attr):
    pseudo_context = { 'object' : object }
    try:
        value = Variable('object.%s' % attr).resolve(pseudo_context)
    except VariableDoesNotExist:
        value = None
return value

それはうまくいきます

あなたのテンプレート内:

{{ user|hash:item }}

@Dave Webb (私はまだコメントできるほど高く評価されていません)

ドット検索は次のように要約できます。テンプレート システムは、変数名にドットを検出すると、次の検索をこの順序で試行します。

* Dictionary lookup (e.e., foo["bar"])
* Attribute lookup (e.g., foo.bar)
* Method call (e.g., foo.bar())
* List-index lookup (e.g., foo[bar])

システムは、機能する最初の検索タイプを使用します。それは短絡ロジックです。

django テンプレートを使用した Google App Engine の user.items の k,v の代替として (user = {'a':1, 'b', 2, 'c', 3})

{% for pair in user.items %}
   {% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}

1
b2
c3

各辞書項目のペア = (キー, 値)。

これはすべきではありません:

{{ user.item }}

これでしょうか?

{{ item }}

そのループ内のコンテキストにはユーザー オブジェクトがありません....?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top