django模板中的两个外键和一个值

django模板中的两个外键和一个值,django,django-models,django-templates,django-views,Django,Django Models,Django Templates,Django Views,我是django的新手,所以这个问题可能很愚蠢,但是如果你知道的话,请随意教我正确的方法。 我试着用谷歌搜索这个问题,但我还是不知所措。 我的问题是: 我的模型中有一个类有两个外键: class X(models.Model): name = models.CharField(max_length=30) def __unicode__(self): return name class Y(models.Model): name = models.Cha

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

Y
{x_列表%中x的百分比}
{{x}
{%endfor%}
{y_列表%中y的百分比}
{{y}
{x_列表%中x的百分比}
{%endfor%}
{%endfor%}
在django中如何正确地执行此操作


非常感谢,

您应该保留您的观点。你为什么不在那里过滤z_列表呢

z_list = Z.objects.filter(x__name__contains=x_pattern, y__name__contains=y_pattern)
作为@DZPM,您应该考虑在您的视图中保留逻辑。[不好意思]我曾经发明了自己的“表”数据结构来做一些非常类似的事情。该表的行对应于
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 %}

另一种方法是在视图中创建生成器,然后将其发送到模板上下文:

# 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 %}
{%y在y_列表%中的y}
{{y}
{%for list_generator.y%}{#pair是您在#之前生成的dict
{{pair.x.name}}:{{pair.z}
{%endfor%}
{%endfor%}

我将自定义过滤器和函数的概念组合为一类对象,将模板过滤器制作成一个函子(函数对象)

以下是我最后做的:

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>
{%load z_filter%}
Y
{x_列表%中x的百分比}
{{x}
{%endfor%}
{y_列表%中y的百分比}
{{y}
{x_列表%中x的百分比}
{x | z_滤波器:y}
{%endfor%}
{%endfor%}

谢谢大家的帮助

我可以在视图中过滤列表,但它仍然不能帮助我正确地显示它(即,我需要将(x,y)密钥对映射到模板中的z[x,y]值,以便在适当的表单元格中显示它)。我错过什么了吗?答对了!非常感谢-这是缺少的链接(自定义过滤器)。