问题描述
我创建了一个书单,可以在Booklist类中上传封面图像。有关更多图像,我添加了另一个名为Bookcover的类。现在在Views.py中,如何使用BookListView发送书本和书本
models.py文件在下面
from django.db import models
from django.utils import timezone
class Booklist(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length = 100)
cover = models.ImageField(null=True,blank=True,default='default-book.jpg')
description = models.TextField()
date_posted = models.DateTimeField(default=timezone.Now)
price = models.DecimalField(decimal_places=3,max_digits=100)
def __str__(self):
return self.title
class Bookcover(models.Model):
post = models.ForeignKey(Booklist,default=None,on_delete=models.CASCADE)
covers = models.ImageField(upload_to = 'images/')
def __str__(self):
return self.post.title
这是views.py文件
from django.shortcuts import render
from django.views.generic import ListView
from .models import Booklist,Bookcover
def home(request):
return render(request,template_name='home/index.html')
class BookListView(ListView):
model = Booklist
template_name = 'home/index.html'
context_object_name = 'books'
ordering = ['-date_posted']
解决方法
如果您创建了ForeignKey
,则Django会自动生成与访问相反的关系-在这种情况下-与特定BookCover
相关的Book
s。由于您未指定related_name=…
parameter [Django-doc],因此此关系的名称为modelname_set
,因此在这种情况下为bookcover_set
。
在模板中,您可以使用以下方式访问书籍的书封面:
{% for book in books %}
{{ book.title }}
{% for cover in book.bookcover_set.all %}
<img src="{{ cover.covers.url }}">
{% endfor %}
{% endfor %}
这将导致一个 N + 1 问题。您可以使用.prefetch_related(…)
[Django-doc]来避免这种情况:
class BookListView(ListView):
queryset = Booklist.objects.prefetch_related('bookcover_set')
template_name = 'home/index.html'
context_object_name = 'books'
ordering = ['-date_posted']