【问题标题】:Django Template double entry tableDjango 模板复式表
【发布时间】:2017-04-04 13:13:49
【问题描述】:

我设置了这些模型:

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

我正在尝试创建一个复式表来显示每个 Bar 的值,它的 Foos 的值,如果 Bar 没有这个 Foo 的值,则 n/a。

这就是我想要的样子:

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

这是我的代码:

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

我不知道如何检查 foobar 是否与 foo 对应。

我可以用 for i in range(0,foo_list.count()) 来做这件事,而用 i 来做这件事,但我不能在 Django 模板语言中做到这一点。

【问题讨论】:

  • 在视图中创建数据会更好。创建一个包含所有 Foo 的标题和一个包含有关 Bar / Foo 关系的所有数据的行列表。逻辑在视图或模型上更好。不在模板中。
  • 这基本上是我所做的。只有我把它放在标签而不是视图中

标签: django django-models django-templates


【解决方案1】:

我找到了解决方案,我创建了一个自定义模板标签来处理逻辑。

@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 编写的标签中,因此具有更大的灵活性。

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 2015-12-11
    • 2014-01-02
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2018-01-27
    • 2020-06-06
    • 2015-04-17
    相关资源
    最近更新 更多