37

GoogleAppEngineと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>

現在、Djangoのドキュメントには、が表示されたときにが記載されています。変数
でデータを取得するためにいくつかのことを試みます。そのうちの1つは辞書検索です。これはまさに私が望むものですが、発生しないようです...

4

6 に答える 6

33

内部で変数を取得するための「より良い」/「より良い」ソリューションを見つけました。これは最も良い方法ではありませんが、機能します。

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

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 }}

そして、それは完全に機能するはずです=)

于 2008-09-08T19:01:24.353 に答える
10

動作しない部分は。だと思い{{ user.item }}ます。

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

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

于 2008-08-30T14:16:54.223 に答える
9

または、次のようにテンプレートの属性を解決するために使用されるデフォルトの 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 }}
于 2010-08-12T09:36:35.287 に答える
4

@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])

システムは、機能する最初のルックアップ タイプを使用します。短絡論理です。

于 2009-08-14T15:45:39.270 に答える
2

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

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

a 1
b 2
c 3

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

于 2010-06-27T00:34:47.973 に答える
0

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

{{ user.item }}

これでしょうか?

{{ item }}

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

于 2008-08-31T22:29:14.453 に答える