2017-11-03 7 views
1

は、私は2つのテーブル文書publishermatterDjangoテンプレートでfilterやgetメソッドを使う方法は?

publishermatterを持って、私は1つの列文書テーブルの外部キーであるFK_doc持っています。

1つのドキュメントでは、publishermatterテーブルに0個以上の行があります。

私はDjangoのテンプレートにドキュメントオブジェクトを渡していますと、私はキー(列名)はPAGECSS(値)

に等しい私がやっている特定の条件でpublishermatterからで行したいです次のようにします。

コード01

<div class="col-sm-7"> 
    {% for item in document.publishermatter_set.key %} 
     {% if item.key == 'PAGECSS' %} 
      <p><br/>{{ item.key }} - {{ item.value }}</p> 
     {% endif %} 
    {% endfor %} 
</div> 

その他の方法は

doc_obj.publishermatter_set.get(key='PAGECSS')

をfollwoing行うことによって、ビューからpublishermatterを渡すことです。しかし、私はドキュメントオブジェクトを渡していますので、私はテンプレートでこれをやりたいですビューから。

は、DjangoのテンプレートにクエリをフィルタするDjango1.4のいずれかの方法はありますか?

+2

それはあなたが絶対にDjangoの1.4を使用してはならない、質問には影響しませんが。サポートされておらず、安全ではありません。 –

+0

@DanielRoseman:はい、同意します。 Django1.4はもはや生きていません。しかし、古いクライアントをサポートするために、私はDjango1.4を使用しています。クライアントはDjangoをアップグレードしたくありません。 –

答えて

4

は、あなたは確かに、この使用してカスタムテンプレートフィルタを行うことができ、それは、それはこのことについて知っている必要はないはずの場所でモデルの実装の詳細を公開することで、適切な設計私見ではありません。

より良い解決策はここにちょうどあなたのモデルクラスに適切なメソッドを追加することです:

class Document(models.Model): 
    # your code here... 

    # NB : may not be the best naming but I don't have enough 
    # context to think of something better... 
    def get_pagecss(self): 
     # NB : only use `.get(...) if you have a unique 
     # constraint on (document, key) in Publishmatter 
     # - else you want to use `filter(...)` and adapt 
     # your template code to work on a queryset instead 
     try: 
      return self.publishermatter_set.get(key="PAGECSS") 
     except Publishmatter.DoesNotExist: 
      return None # or anything that makes sense 

してからテンプレートに:

<div class="col-sm-7"> 
    {% with document.get_pagecss as item %} 
     {% if item%} 
     <p><br/>{{ item.key }} - {{ item.value }}</p> 
     {% endif %} 
    {% endwith %} 
    </div> 

は、あなたが本当にが何を公開する場合あなたがカスタムテンプレートフィルタのために行くことができるテンプレートレイヤーの一部としての実装の詳細(より多くの文脈なしのAFAICT)であるようです。ダニエル・ローズマンは当然言及として、

<div class="col-sm-7"> 
    {% with document|publishmatter_get:"PAGECSS" as item %} 
     {% if item%} 
     <p><br/>{{ item.key }} - {{ item.value }}</p> 
     {% endif %} 
    {% endwith %} 
    </div> 

ああ、はい:ジャンゴをすでにあなたのアプリ(if not just check the doc)のためのいくつかのtemplatagsファイルを持っていると仮定すると、あなたのフィルタは次のようになります。

@register.filter 
def publishmatter_get(obj, key): 
    try: 
     return obj.publishmatter_set.get(key=key) 
    except Publishmatter.DoesNotExist: 
     return None # etc... 

とテンプレートで1.4は長く死んでいる、維持されていない、サポートされていない、そして安全でない。私はこれが唯一のあなた次第ではないかもしれませんが、あなたはできるだけ早く最近、サポートされるリリースに本当に切り替える必要があります理解しています。

+0

はい+1、私は他のテーブルと同じ方法を使用しています。私はただテンプレートで直接書くことができるものを探しています。答えてくれてありがとう。 –

+1

Djangoのテンプレートシステムで@VivekSableの制限がある - テンプレートコードで何かが簡単にできない場合は、おそらくテンプレートレイヤーに属していないでしょう。ここでの正しい質問は次のとおりです。問題は、プレゼンテーションの問題のみです(この場合、ビューまたはテンプレートレイヤに属します)。または、「ドメイン」レイヤの一部として意味をなすものです。あなただけ(このプロジェクトに取り組んでいる誰かが、この質問に答えることができます)。 –

+0

完全性のために@VivekSableカスタムテンプレートフィルタを使用した例を追加しました。 –

関連する問題