如何在Django中从基于类的视图发送多个模型

问题描述

我创建了一个书单,可以在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'] 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...