我正在完成我的第一个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 %}
答案 0 :(得分:1)
您需要使用外键相关名称访问中间对象和正文对象。
如果我理解你的问题:
MIDDLE
(SIDE
)元素。BODY
元素相关联的MIDDLE
元素要完成此任务,您需要:
TOP
元素MIDDLE
对象的外键的TOP
对象进行循环因此,你的循环将如下所示:
{% 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
其他几点说明:
MIDDLE
和TOP
TOP
个对象传递给视图