为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喵时光机 2023-07-11 14:28:34
我制作了一个书单,可以在 Booklist 类中上传封面图像。为了获得更多图像,我添加了另一个名为 Bookcover 的类。现在在 Views.py 中如何使用 BookListView 发送 Booklist 和 Bookcovermodels.py 文件如下from django.db import modelsfrom django.utils import timezoneclass 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.titleclass 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 renderfrom django.views.generic import ListViewfrom .models import Booklist, Bookcoverdef 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'] 
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

如果您创建一个ForeignKey,Django 将自动生成一个反向关系来访问(在本例中)BookCover特定的相关 s Book。由于您没有指定related_name=…参数 [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'] 


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信