在模板内嵌套循环

时间:2018-10-25 08:18:30

标签: python django

models.py

class Task(models.Model):
     level = models.ForeignKey(Level, on_delete=models.CASCADE)
     todo = models.ForeignKey(ToDo, on_delete=models.CASCADE)
     student = models.ForeignKey(User, on_delete=models.CASCADE)
     title = models.CharField(max_length=150)
     content = models.TextField()
     timestamp = models.TimeField(auto_now=True)
     datestamp = models.DateField( auto_now=True)
     like = models.ManyToManyField(User,related_name='user_likes', blank=True)
     is_verified=models.BooleanField(default=False, blank=True)

     def __str__(self):
        return self.title

     def get_absolute_url(self):
        return reverse('student:task-detail', kwargs={'pk': self.pk})

     objects = PostManager()

     @property
     def comments(self):
        instance = self
        qs = Comment.objects.filter_by_instance(instance)
        return qs

     @property
     def get_content_type(self):
        instance = self
        content_type = ContentType.objects.get_for_model(instance.__class__)
        return content_type


class Images(models.Model):
     post = models.ForeignKey(Task, default=None,on_delete=models.CASCADE)
     image = models.ImageField(verbose_name='Image',blank=True)

     def __str__(self):
        return self.post.title

我有两个模型Task和Images。我为任务保存了多个图像。我想使用分页显示任务列表以及每个任务中的图像。

views.py:

@login_required(login_url='/account/login/')
@page_template('student_dash_page.html')
def StudentDashView(request,template='student_dash.html',  extra_context=None):
    if not request.user.is_authenticated:
        return redirect('accounts:index')
    task = Task.objects.all().order_by('timestamp')
    images = Images.objects.filter(post=task)
    notifications =  Notification.objects.filter(receiver=request.user).order_by('-timestamp')

    page = request.GET.get('page', 1)
    paginator = Paginator(task, 10)
    try:
        tasks = paginator.page(page)
    except PageNotAnInteger:
        tasks = paginator.page(1)
    except EmptyPage:
        tasks= paginator.page(paginator.num_pages)

    context = {
        'notifications': notifications,
        'nbar': 'home',
        'task': tasks,
        'images': images
    }
    if not request.user.is_client:
        return HttpResponse("You are in trainer account")
    if extra_context is not None:
        context.update(extra_context)
    return render(request, template, context)

如何使用for循环使图像正确显示在模板中

我正在尝试

  {% for obj in task %}
  <p>{{ obj.title }}

  {% for image in images %}
   <img src="{{ image.url }}"</img>
   {% endfor %}

  {% endfor %}

出现错误:使用切片将精确查询的QuerySet值限制为一个结果。

1 个答案:

答案 0 :(得分:2)

此行没有任何意义:

images = Images.objects.filter(post=task)

因为task是所有Task实例的查询集。

您完全不需要在视图中获取图像。删除该行和其他引用,然后在模板中执行以下操作:

{% for obj in task %}
    <p>{{ obj.title }}</p>

    {% for image in obj.images_set.all %}
      <img src="{{ image.image.url }}"</img> 
    {% endfor %}

{% endfor %}

还要注意,Image对象有一个名为image的字段,这就是您需要访问url属性的地方。

(为了提高数据库效率,您可能需要在视图中稍微更改查询:

task = Task.objects.all().order_by('timestamp').prefetch_related('images_set')

否则,每次迭代将导致单独的db调用以获取相关图像。不过,您不需要这样做就能使事情正常进行。)

相关问题