首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个表加载到Django视图中?

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

Stack Overflow用户
提问于 2016-06-08 21:43:23
回答 1查看 153关注 0票数 1

我正在完成我的第一个Django项目(除了几个教程),并且一直在研究如何完成这个任务。为了简单起见,我将使用Excel类推来解释我要做的事情。我有7个按钮横跨第1行(顶级模型)。单击这些按钮中的任何一个,然后显示A列(侧模型)中的5个项的列表,其中第2-6行(BODY Model)中都有相应的项。在视图中,我可以通过TOP主键加载侧模型,但是无法知道如何连接主体模型,因为它依赖于侧模型。

视图

代码语言:javascript
复制
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})

模型

代码语言:javascript
复制
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)

模板

代码语言:javascript
复制
{% 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 %}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 22:17:56

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

如果我正确理解你的问题:

  • 您只想显示与选定的TOP元素关联的MIDDLE (SIDE)元素。
  • 您只想显示与显示的BODY元素相关联的MIDDLE元素。

要做到这一点,您需要:

  1. 跟踪选择了哪个TOP元素
  2. 只循环使用指向此MIDDLE对象的外键遍历TOP对象

因此,您的循环将如下所示:

代码语言:javascript
复制
{% 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访问外键所使用的模板语法

代码语言:javascript
复制
<object>.<related_name>.all

还有几个注意事项:

  • 它的标准用法是使用复数变量名称表示一组对象,使用单数名称表示集合中的单个元素;
  • 您正在混合使用MIDDLETOP
  • 您只需要将一组TOP对象传递给视图
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37713454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档