Django模板双入口表

时间:2017-04-04 13:13:50

标签: django django-models django-templates

我已经设置了这些模型:

config.reserved_words = %w(new edit .... explore admin)

我正在尝试制作一个双条目表来显示每个条形图,其Foos的值,以及如果条形图没有此Foo的值则不需要。

这就是我想要的样子:

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()

这就是我的代码:

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

我无法弄清楚如何检查foobar是否与foo相对应。

我可以使用<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%} for i in range(0,foo_list.count())混乱,但我不能在Django Template Langage中执行此操作。

1 个答案:

答案 0 :(得分: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编写的标签,这样就可以更灵活。