【问题标题】:Django template nested for loopDjango模板嵌套for循环
【发布时间】:2017-06-27 06:28:56
【问题描述】:

我有 2 张桌子:

Table1: [A-Foriegn Key, field1]
Table2: [Table1-Foriegn Key, field2]

如果表 2 中存在项目,我想显示一个包含表 1 字段 1 的不同值的列表。在该列表中,我想显示与 Table1 的 field1 对应的 Table2 的所有元素。

我正在尝试:

{% for t1 in Table1 %}
   Display field1 of t1
   {% for t2 in Table2 %}
      Display field2 of t2.
   {% endfor %}
{% endfor %}

表 1:

╔════╦══════════════╦══════╗
║ Id ║  EventName   ║ FK   ║
╠════╬══════════════╬══════╣
║  1 ║ Christmas    ║  56  ║
║  2 ║ Black Friday ║  18  ║
╚════╩══════════════╩══════╝

表 2:

╔════╦══════════════╦══════╗
║ ID ║  Image       ║ FK   ║
╠════╬══════════════╬══════╣
║  1 ║ image1_url   ║  1   ║
║  2 ║ image2_url   ║  1   ║
║  3 ║ image3_url   ║  2   ║
║  4 ║ image4_url   ║  2   ║
╚════╩══════════════╩══════╝

我想在列表中显示:圣诞节和黑色星期五。

在单击列表中的元素时,我想显示该特定事件的所有 url。 就像点击圣诞节一样:应该显示 image1_url 和 image2_url。

我不想发出 AJAX 请求。

【问题讨论】:

  • 能否给出表格中的示例数据和示例输出?
  • 我已经添加了示例数据。

标签: python django-templates


【解决方案1】:

您可以在模板中使用外键映射来引用对象。

假设你有两个表 Table1 和 Table2,映射为 Table1 -> Table2,在 Table2 中有一个外键字段引用 Table1,你可以这样做:

您的views.py 会是这样的:

table1 = Table1.objects.all() 
table2 = Table2.objects.all() 
return render('template_name.html',{'table1':table1, 'table2':table2})

那么您的 html 模板将如下所示:

{% for table1Instace in table1 %}
    
    {% for table2Instance in table1Instace.table2_set.all %}
    
    <!--Print table elements here-->
    
    {% endfor %}

{% endfor %}

您的 table2Instance 将是 table2 中与它们在 table1 中的外键映射相对应的行的对象。

【讨论】:

  • 对上述答案的两个小修正。可能不需要查询表 2。同样在模板中,我们不能在“all()”之后使用 ()。这类似于在视图中使用“.items()”而在模板中使用“items”。
  • table1Instace.table2_set.all 我可以从这个列表中获取第一个元素
【解决方案2】:

models.py

class Category(models.Model):
    name = models.CharField(max_length=45, blank=True)

class Items(models.Model):
    name = models.CharField(max_length=45, blank=True)
    rate = models.FloatField(default=0)
    category_id = models.ForeignKey(Category)

views.py

def test_category(request):
    s = Category.objects.all()
    return_dict = {
        's' :   s        
    }
    return render(request, 'base.html', return_dict)

{% for item in s%}
    {{ item.name }}
    {% for x in item.items_set.all %}
        -- {{ x.name }}
    {% endfor %}
{% endfor %}

【讨论】:

  • s 必须是 Items 的查询集。
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 2019-08-02
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
相关资源
最近更新 更多