2017-04-04 6 views
0

私は、これらのモデルには設定していますBarにはこのFooの値はありません。Djangoのテンプレートのダブルエントリーはテーブル

これは、私はそれが見えるようにしたいです。私はfoobarにはに対応しているかどうかを確認する方法を見つけ出すことはできません

<tr> 
{%for foo in foo_list%} 
    <th>{{foo.name}}</th> 
{%endfor%} 
</tr> 
{%for bar in bar_list%} 
    <th>{{bar.name}}</th> 
    {%for foo in foo_list%} 
     {%for foobar in bar.foobar_set.all%} 
      {%if foobar.foo == foo%} 
       <td>{{foobar.value}}</td> 
      {%endif%} 
     {%endfor%} 
    {%endfor%} 
</tr> 
{%endfor%} 

 [Foo1] [Foo2] [Foo3] 
[Bar1] 4  n/a  n/a 
[Bar2] 3  n/a  9 
[Bar3] n/a  1  n/a 

そして、これは私が持っているコードです。 foo。

私はfor i in range(0,foo_list.count())でそれを行うことができ、iと混乱しますが、私はDjango Template Langageでこれを行うことはできません。

+1

ビューでデータを作成する方がよいでしょう。あなたのすべてのFooと行リストと、Bar/Fooの関係に関するすべてのデータを含むヘッダーを作成します。ロジックは、ビューまたはモデルで優れています。テンプレートにはありません。 – Wilfried

+0

これは基本的に私がやったことです。私はそれをビューの代わりにタグに入れました – pocpoc47

答えて

0

私は解決策を見つけました。ロジックを処理するカスタムテンプレートタグを作成しました。

@register.simple_tag 
def get_bar_foos_values(bar, foo_list): 
    i = 0 
    j = 0 
    output = [] 
    foobar_set = bar.foobar_set 
    while(i < foo_set.count()): 
     foo = foo_set.all()[i] 
     if(j < foobar_set.count() and foobar_set.all()[j].foo == foo): 
      output.append(foobar_set.all()[j].value) 
      i = i+1 
      j = j+1 
     else: 
      output.append("n/a") 
      i = i+1 
    return output 

そして、私のテンプレートで:

{%for bar in bar_list%} 
    <tr> 
     <th>{{bar.name}}</th> 
     {%get_bar_foos_values bar foo_set as foobars%} 
     {%for foobar in foobars%} 
      <td>{{foobar}}</td> 
     {%endfor%} 
    </tr> 
{%endfor%} 

それはそれを行うための最善の方法ではないかもしれないが、それは私のために動作します。私がした唯一のことは、アルゴリズムをテンプレートから実際のPythonで書くことができるタグに移動することです。

関連する問題