2017-04-04 1 views
0

Ich habe diese Modelle ein:Django Template zweispaltige Tabelle

class Bar: 
    name = models.CharField() 
    foos = models.ManyToManyField(
     through='FooBar' 
     through_fields=('bar','foo') 
    ) 
class Foo: 
    name = models.CharField() 

class FooBar: 
    foo = models.ForeignKey(Foo) 
    bar = models.ForeignKey(Bar) 
    value = models.DecimalField() 

Ich versuche, eine zweispaltige Tabelle für jede Bar, den Wert seiner Foos und n/a zu zeigen, zu machen, wenn die Bar hat keinen Wert für dieses Foo.

Dies ist, was ich will es aussehen:

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

Und das ist der Code, den ich habe:

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

Ich kann nicht herausfinden, wie wenn die foobar entsprechen überprüfen das Foo.

Ich könnte es mit einem for i in range(0,foo_list.count()) und Chaos mit dem i, aber ich kann dies nicht in Django Template Langage tun.

+1

ist es besser, Ihre Daten in Ihrer Ansicht zu erstellen. Erstellen Sie eine Kopfzeile mit all Ihren Foo- und einer Zeilenliste mit all Ihren Daten über die Bar/Foo-Beziehung. Logik ist besser in Ansicht oder Modell. Nicht in der Vorlage. – Wilfried

+0

Es ist im Grunde, was ich getan habe. Nur ich habe es in ein Tag eingefügt, statt zu sehen – pocpoc47

Antwort

0

Ich fand eine Lösung, ich erstellte ein benutzerdefiniertes Template-Tag, um die Logik zu behandeln.

@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 

Und in meiner Vorlage:

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

Es kann nicht der beste Weg, es zu tun, aber es funktioniert für mich. Das einzige, was ich getan habe, ist den Algorithmus von der Vorlage zu einem Tag zu bewegen, den ich in echtem Python schreiben kann, also mit viel mehr Flexibilität.