首页 > 解决方案 > Django For Loop循环打印数据

问题描述

我有一个按类别和班级排列的测验列表。我想使用引导描述 lsit 对齐来打印

Class XI    Mathematics     Quiz 1
                            Quiz 2
                            Quiz 3
            Physics         Quiz 3
                            Quiz 4
Class XII   History         Quiz 7
                            Quiz 8

使用

<dl class="row">
  <dt class="col-sm-3">Class XI</dt>
  <dd class="col-sm-3">Mathematics</dd>
  <dd class="col-sm-3">Quiz 1</dd>
</dl>

如何使用重组编写我的 django for 循环?感谢您的帮助。

class Quiz(models.Model):

    title = models.CharField(
        verbose_name=_("Title"),
        max_length=300, blank=False)
     
    category = models.ForeignKey(
        Category, null=True, blank=True,
        verbose_name=_("Category"), on_delete=models.CASCADE)

class Category(models.Model):

    category = models.CharField(verbose_name=_("Category"),max_length=250, blank=True, null=True)
    
    class_id = models.ForeignKey(studentclass, null=True, blank=True, on_delete=models.CASCADE)  

class studentclass(models.Model):

    class_id= models.CharField(primary_key=True,max_length=5)
    classVal =models.CharField(max_length=255, null=True, blank=True)

标签: pythondjangodjango-templates

解决方案


首先,我们将选择所有studentclass并使用prefetch_related[Django docs]预取所有相关CategoryQuiz实例。我们还可以查询所有Quiz实例并使用select_related[Django docs],它的好处是只查询一次数据库,但缺点是在 python 端的内存中创建了更多对象。

object_list = studentclass.objects.all().prefetch_related('category_set__quiz_set')

注意:这将变量应该在上下文中传递。

现在我们需要渲染到模板。您只想在某些内容发生更改时才显示它们。您可以为此目的使用ifchanged模板标签:

{% for student_class in object_list %}
    {% for category in student_class.category_set.all %}
        {% for quiz in category.quiz_set.all %}
            <dl class="row">
                <dt class="col-sm-3">{% ifchanged student_class.classVal %}{{ student_class.classVal }}{% endifchanged %}</dt>
                <dd class="col-sm-3">{% ifchanged student_class.classVal category.category %}{{ category.category }}{% endifchanged %}</dd>
                <dd class="col-sm-3">{{ quiz.title }}</dd>
            </dl>
        {% endfor %}
    {% endfor %}
{% endfor %}

{{ student_class.classVal }}只有当它的值与上一次迭代相比发生了变化时,才会渲染。也{{ category.category }}将仅在它已更改或类已更改时呈现。

注意:您可以尝试使用on和类别选择Quiz实例并使用 来获取它们。这完全取决于哪个查询对您更有效。order_bycategoryclass_idselect_related


推荐阅读