📜  嵌套循环中的 django 模板子数据 - Python (1)

📅  最后修改于: 2023-12-03 15:25:24.302000             🧑  作者: Mango

嵌套循环中的 Django 模板子数据

在 Django 模板中,我们可以使用变量和标签处理数据。但有时候我们需要在嵌套循环中使用子数据,此时就需要使用一些特殊的标签和语法。

让我们看看如何在嵌套循环中使用 Django 模板子数据。

原始数据

首先,让我们定义一些原始的数据。我们将创建一个包含学生和课程列表的字典,每个学生都可以注册多个课程。

students = [
    {'name': 'Alice', 'register': ['Math', 'Science']},
    {'name': 'Bob', 'register': ['English', 'Science', 'History']},
    {'name': 'Charles', 'register': ['Math', 'English', 'Physics']},
]
基本循环

我们可以使用普通的循环语法显示学生和其所注册的每个课程:

{% for student in students %}
    <h1>{{ student.name }}</h1>
    <ul>
        {% for course in student.register %}
            <li>{{ course }}</li>
        {% endfor %}
    </ul>
{% endfor %}

以上代码的输出结果为:

<h1>Alice</h1>
<ul>
    <li>Math</li>
    <li>Science</li>
</ul>

<h1>Bob</h1>
<ul>
    <li>English</li>
    <li>Science</li>
    <li>History</li>
</ul>

<h1>Charles</h1>
<ul>
    <li>Math</li>
    <li>English</li>
    <li>Physics</li>
</ul>
循环计数器

如果我们还想显示每个学生所注册课程的编号、名称、和学分等信息,就需要使用循环计数器。在 Django 模板中,我们可以使用 forloop 来获得当前循环的信息。

{% for student in students %}
    <h1>{{ student.name }}</h1>
    <table>
        <tr>
            <th>#</th>
            <th>Course name</th>
            <th>Credits</th>
        </tr>
        {% for course in student.register %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ course }}</td>
                <td>{{ forloop.counter0|add:1 }}</td>
            </tr>
        {% endfor %}
    </table>
{% endfor %}

此代码会创建一个 HTML 表格,显示每学生所注册课程的编号、名称、和学分量。在上述代码中,使用了以下变量:

  • forloop.counter - 当前循环的值(从 1 开始计数)
  • forloop.counter0 - 当前循环的值(从 0 开始计数)
  • add:1 - 在计算循环计数器时,添加 1 到结果中。
子循环

如果我们还想显示每门课程的评分和教师信息,就需要使用子循环。

我们可以先将学生和其注册的所有课程组成一个列表,然后对每门课程使用嵌套的循环和条件语句。

courses = [
    {'name': 'Math', 'teacher': 'Mr. White', 'score': 80},
    {'name': 'Science', 'teacher': 'Ms. Green', 'score': 90},
    {'name': 'English', 'teacher': 'Mr. Black', 'score': 85},
    {'name': 'History', 'teacher': 'Ms. Brown', 'score': 95},
    {'name': 'Physics', 'teacher': 'Mr. Grey', 'score': 75},
]

现在我们可以将列表添加到学生数据字典中。

students = [
    {'name': 'Alice', 'register': ['Math', 'Science']},
    {'name': 'Bob', 'register': ['English', 'Science', 'History']},
    {'name': 'Charles', 'register': ['Math', 'English', 'Physics']},
]

for student in students:
    student['courses'] = []
    for course in courses:
        if course['name'] in student['register']:
            student['courses'].append(course)

现在我们可以在模板中使用嵌套的循环和条件语句来显示每门课程的评分和教师信息。

{% for student in students %}
    <h1>{{ student.name }}</h1>
    <table>
        <tr>
            <th>#</th>
            <th>Course name</th>
            <th>Credits</th>
            <th>Teacher</th>
            <th>Score</th>
        </tr>
        {% for course in student.courses %}
            <tr>
                <td>{{ forloop.parentloop.counter }}-{{ forloop.counter }}</td>
                <td>{{ course.name }}</td>
                <td>{{ forloop.counter }}</td>
                <td>{{ course.teacher }}</td>
                <td>{{ course.score }}</td>
            </tr>
        {% empty %}
            <tr>
                <td colspan="5">None</td>
            </tr>
        {% endfor %}
    </table>
{% endfor %}

此代码会创建一个 HTML 表格,显示每学生所注册课程的编号、名称、和学分量。在上述代码中,使用了以下变量:

  • forloop.parentloop.counter - 外层循环的计数器。
  • empty - 在没有可迭代的项目时使用的标记。
结论

嵌套循环中的 Django 模板子数据可以帮助我们在模板中处理复杂的数据结构。可以使用循环计数器和条件语句来迭代、过滤和组合数据。