2017-08-14 16 views
0

この問題をdjangoテンプレートで発見しました。私はこの解決策が他の人にとって役に立つかもしれないと考えました:
ここではかなり複雑な状況になるので、単純な例では:
は、我々はテンプレートに記事や自分のIDとタイトルのリストにアクセスする必要があると仮定しましょう。さらに我々は、彼らがクラス属性ではないので、辞書を使用して(出版社のような)各記事について、いくつかの余分なデータを渡したいです。それをさらに困難にするのは、この記事に2つずつアクセスしたいときです。最後の項目のインデックス0の範囲にわたってループの反復のためにAを意味すると同時に、アイテム番号iとI + 1にアクセスすることができます。 []は、テンプレートでサポートされていないためDjangoループとテンプレート内のオブジェクトと辞書項目へのアクセス

{{ publishers[article.id] }} 

:あなたはあなたが行うことはできませんDjangoテンプレートで辞書を使用したい場合は、あなたが知っているかもしれないとしてあるため
これは特に大変でした。

:あなたは

{{ publishers.0 }} 

が、Djangoテンプレートなどの属性としてフィールドを扱うことができ大したあなたは

{{ publishers.article.id }} 

おろかforループを使用したなどのリストやインデックスを通じての記事にアクセスをやらないではないだろう

{{ publishers.articles.i.id }} 

ので、私たちは何をしますか?

答えて

0

ので、ここで答えがあります。 それは少し複雑な上だが、私はすべての可能性をカバーしたかったです。我々はthisのように私たち自身のフィルタを定義することにより、辞書のオブジェクトにアクセスできるようにする必要があり
最初のオフ:

from django import template 
register = template.Library() 

def hash_dict(h, key): 
    return h[key] 

def get_attr(item,field): 
    dict_obj = item.__dict__ 
     return dict_obj[field] 

register.filter('hash_dict',hash_dict) 
register.filter('get_attr',get_attr) 

我々は一瞬にget_attr方法を取得しますが、今のところ、私たちは辞書にアクセスすることができますテンプレート内のオブジェクト:

{% load modulename %} 
{{ dictionary|hash_dict:obj.id }} 

forループを使用すると、範囲オブジェクトまたはテンプレートをテンプレートに渡すことができます。

range_of_article = range(0, len(articles_list), 2) 

何らかの形でその変数をテンプレートに渡します。あなたのテンプレートで
:get_attr方法が便利になるところ

{% for i in range_of_article %} 
    {% with article=articles|hash_dict:i %} 
     {% with article_id=article|get_attr:'id' %} 
     {{ publishe|hash_dict:article_id }} 

これがあります。私はarticle.idをここで何の問題もなく使っていたかもしれませんが、時にはそうではありません。この回避策は、object.attributeを使用してオブジェクトのattrubuteにアクセスできないときには非常に便利です。
、最終的に同時にIとI + 1へのアクセス権を持っている:

{% for i in range_of_article %} 
    {% with j=i|add:1 %} 
     {% with article=articles|hash_dict:i article2=articles|hash_dict:j %} 
     {% with article_id=article|get_attr:'id' article_id2=article2|get_attr:'id'%} 
      {{ publishe|hash_dict:article_id }} 
      {{ publishe|hash_dict:article_id2 }} 
+0

これは本当に過剰に複雑です。単純な 'for'を使ってリストを反復するだけで、dictの場合は' .items'を繰り返してキーと値を渡すことができます。とにかくdictに別々の値を渡す必要はありません。それらのオブジェクトに直接注釈を付けることができます。 –

+0

私はそれが過度に複雑であることを知っています。特定のケースでは、アイテムを繰り返したり値に注釈を付けることができなかったという事実がありました。ポイントは、私がその過程で学んだほとんど全てをカバーする最も複雑なシナリオを想定することです。私はこれが私の立場にある人を助けるかもしれませんが。ほとんどの目的のためにあなたが言及したことは十分です。 –

関連する問題