我已经设置了这些模型:
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中执行此操作。
答案 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编写的标签,这样就可以更灵活。