如何将多个表加载到Django视图中?

时间:2016-06-08 21:43:23

标签: django django-templates django-views

我正在完成我的第一个Django项目(除了几个教程之外),我仍然坚持如何实现这一目标。为简单起见,我将使用Excel类比来解释我正在尝试做的事情。我在第1行(TOP模型)上有7个按钮。单击这些按钮中的任何一个,然后在A列(SIDE模型)中显示5个项目的列表,这些项目在第2-6行(BODY模型)中都有相应的项目。在视图中我可以通过TOP模型主键加载SIDE模型,但无法弄清楚如何连接BODY模型,因为它依赖于SIDE模型。

查看

def details(request, pk):
    top = TOP.objects.filter().order_by('-modified_date')
    middle= MIDDLE.objects.filter(TOP_id__pk=pk)
    body = BODY.objects.filter(??????????)
   return render(request, 'details.html', {'top': top, 'middle': middle,
                                                      'body': body})

MODEL

class TOP(models.Model):
    title = models.CharField(max_length=200)

class MIDDLE(models.Model):
    TOP= models.ForeignKey('mysite.TOP', related_name='middle')
    title = models.CharField(max_length=200)

class BODY(models.Model):
    TOP= models.ForeignKey('mysite.TOP', related_name='indicators')
    MIDDLE= models.ForeignKey('mysite.MIDDLE', related_name='indicators')
    title = models.CharField(max_length=200)

模板

{% block content %}
<div>

    <div class="TOP-container">
        {% for tops in top %}
            <div class="tops"><a href="{% url 'details' pk=tops.pk %}">{{ tops.title }}</a></div>
        {% endfor %}
    </div>

    {% for middles in middle %}
        <div class="middle-container">
            <div class="middles">{{ middles.title }}</div>
            {% for bodys in body %}
                <div class="bodys">{{ body.title }}</div>
            {% endfor %}
        </div>
    {% endfor %}

</div>
{% endblock %}

1 个答案:

答案 0 :(得分:1)

您需要使用外键相关名称访问中间对象和正文对象。

如果我理解你的问题:

  • 您只想显示与所选TOP元素相关联的MIDDLESIDE)元素。
  • 您只想显示与显示的BODY元素相关联的MIDDLE元素

要完成此任务,您需要:

  1. 跟踪选择了哪个TOP元素
  2. 仅使用指向此MIDDLE对象的外键的TOP对象进行循环
  3. 因此,你的循环将如下所示:

    {% for middle in selected_top.middle.all %}
        <div class="middle-container">
            <div class="middles">{{ middle.title }}</div>
            {% for body in middle.indicators.all %}
                <div class="bodys">{{ body.title }}</div>
            {% endfor %}
        </div>
    {% endfor %}
    

    请注意用于通过related_name访问外键的模板语法:

    <object>.<related_name>.all
    

    其他几点说明:

    • 其标准是使用复数变量名来表示一组对象和一个单数名来表示集合中的单个元素;你做了相反的事情
    • 您正在混合使用MIDDLETOP
    • 您只需将TOP个对象传递给视图