我是django的新手,所以这个问题可能很愚蠢,但如果你知道的话,请随时教我正确的方法。 我试过谷歌搜索问题,但我仍然处于亏损状态。 这是我的问题:
我的模型中有一个类有两个外键:
class X(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return name
class Y(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return name
class Z(models.Model):
name = models.CharField(max_length=30)
x = models.ForeignKey(X)
y = models.ForeignKey(Y)
def __unicode__(self):
return name
在我的视图中,我获得了X对象的部分列表和Y对象的部分列表,如下所示:
def MyView(x_pattern, y_pattern):
x_list = X.objects.filter(name__contains=x_pattern)
y_list = Y.objects.filter(name__contains=y_pattern)
z_list = Z.objects.all()
return render_to_response({'x_list': x_list, 'y_list': y_list, 'z_list': z_list})
在我的模板中,我希望能够显示如下表格:
<table>
<tr>
<td>Y</td>
{% for x in x_list %}
<td>{{ x }}</td>
{% endfor %}
</tr>
{% for y in y_list %}
<tr>
<td>{{ y }}</td>
{% for x in x_list %}
<td>
<!-- here I need help:
I need to display z[x, y] if it exists, or "N/A" otherwise.
-->
</td>
{% endfor %}
</tr>
{% endfor %}
如何在django中正确执行此操作?
非常感谢,
答案 0 :(得分:1)
作为@DZPM suggested,您应该考虑在您的视图中保留逻辑。 [懦弱]我曾经发明了自己的“表”数据结构来做一些非常相似的事情。该表包含与X
对应的行,与Y
对应的列和与Z[X, Y]
对应的单元格。然后我写了get_row
和get_cell
过滤器来完成模板中的技巧。 [/羞怯]
也就是说,您可以使用一对自定义过滤器来完成您想要的任务。这个解决方案相当冗长。
@register.filter
def x_is(value, x):
return value.x == x
@register.filter
def y_is(value, y):
return value.y == y
您可以在模板中使用这些过滤器,如下所示:
{% if z|x_is:x and z|y_is:y %}
{{ z }}
{% else %}
N/A
{% endif %}
答案 1 :(得分:0)
您应该在视图中保留逻辑。你为什么不在那里过滤z_list?
z_list = Z.objects.filter(x__name__contains=x_pattern, y__name__contains=y_pattern)
答案 2 :(得分:0)
另一种方法是在视图中创建生成器,然后将其发送到模板上下文:
# nested inside your view function
def x_and_z_list(y):
for x in x_list:
z_obj = x.z_set.filter(y=y)
z_name = z_obj or 'N/A'
yield {'x': x, 'z': z_name}
return render_to_response('mytemplate', {'list_generator': x_and_z_list}
然后你的模板看起来像这样:
{% for y in y_list %}
<tr>
<td>{{ y }}</td>
{% for pair in list_generator.y %} {# pair is the dict you yielded before #}
<td>{{ pair.x.name }}: {{ pair.z }}</td>
{% endfor %}
</tr>
{% endfor %}
答案 3 :(得分:0)
我将自定义过滤器和函数的概念组合为第一类对象,将模板过滤器转换为函子(函数对象)。
这是我最终做的事情:
def z_filter(x, y):
z_list = list(Z.objects.filter(x, y))
return z_list.pop().name or 'N/A'
register.filter(z_filter)
在模板中:
{% load z_filter %}
<table>
<tr>
<td>Y</td>
{% for x in x_list %}
<td>{{ x }}</td>
{% endfor %}
</tr>
{% for y in y_list %}
<tr>
<td>{{ y }}</td>
{% for x in x_list %}
<td>{{ x|z_filter:y }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
感谢大家的帮助!