我应该如何迭代这个Django模板中的对象字典?

时间:2016-11-02 18:35:17

标签: django loops django-templates

我有以下观点。

def select_classes(request):
 ...
            classesBySelectedGrade = courseBlock.objects.filter(grades__grade__contains=form['grade'].value()).order_by(
                'time')
            classOptionCount = classesBySelectedGrade.all().count()    

            classOptionDict = {}    

            for i in range(classOptionCount):
                classOptionDict["option " + str(i + 1)] = classesBySelectedGrade    

    return render(request, 'select-classes.html', {'classesOptions': classOptionDict})

上述观点的目标:

  1. 是采取一套"课程"按时间排序。
  2. 创建课程集合的副本n次多次为courses.count()
  3. 将每个副本添加到字典
  4. 将此词典传递给我的模板。
  5. 以下是传递的数据。

     {
         'classesOptions': {
             'option 1': < QuerySet[ < courseBlock: Course Block: Some Course Block 1 - Start: 07: 00: 00, Endtime: 08: 00: 00: > , < courseBlock: Course Block: Some Course Block 2 - Start: 07: 00: 00, Endtime: 08: 00: 00: > ] > ,
             'option 2': < QuerySet[ < courseBlock: Course Block: Some Course Block 1 - Start: 07: 00: 00, Endtime: 08: 00: 00: > , < courseBlock: Course Block: Some Course Block 2 - Start: 07: 00: 00, Endtime: 08: 00: 00: > ] >
         }
     }
    

    我目前在模板中的目标:

    1. 迭代传入字典以读取值。
    2. 这是我正在使用的当前循环。

      {% for classesOption in classesOptions %}
      
          <p>
              {{ classesOption }}
      
              {% for classes in classesOption %}
      
                  {{ classes }}
      
              {% endfor %}
      
          </p>
      
      {% endfor %}
      

      这是我的输出。

      option 2 o p t i o n 2
      option 1 o p t i o n 1
      

      上述输出与我正在测试的特定数据有关。 那是我期待在这个测试案例中有两个副本。

      有关更多背景信息,请参阅我的模型:

      class Course(models.Model):
          title = models.CharField(max_length=200)
          limit = models.IntegerField(default=10)
          description = models.TextField(max_length=800)
          location = models.CharField(max_length=200, default="")
          teachers = models.TextField(max_length=800, default="")
      
      class startEndTime(models.Model):
          endTime = models.TimeField()
          startTime = models.TimeField()
      
      class courseBlock(models.Model):
          course = models.ManyToManyField(Course, related_name='course_in_block')
          grades = models.ManyToManyField(Grade, related_name='name_in_block')
          title = models.CharField(max_length=100)
          time = models.ForeignKey(startEndTime, on_delete=models.CASCADE)
      

1 个答案:

答案 0 :(得分:1)

迭代Python中的dict(扩展名为Django的模板语言)将迭代,而不是。然后,您将遍历密钥,这是一个字符串。迭代字符串将返回单个字符。

在这种情况下,您似乎想要打印密钥然后迭代该值。您可以使用dict.items方法同时迭代键和值:

{% for option, classes in classesOptions.items %}
    <p>
        {{ option }}
        {% for class in classes %}
            {{ class }}
        {% endfor %}
    </p>
{% endfor %}