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值限制为一个结果。
答案 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调用以获取相关图像。不过,您不需要这样做就能使事情正常进行。)