Django テンプレートと変数属性
-
09-06-2019 - |
質問
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 }}
そのループ内のコンテキストにはユーザー オブジェクトがありません....?