首页 > 解决方案 > 如何显示多对一关系的内容

问题描述

所以我要疯了,试图弄清楚这似乎是一个非常简单的任务。

我正在制作一个投资组合网站。它有 2 个模型,项目和图像。Project 包含每个项目的大部分数据,而 Image 以多对一的关系为每个项目提供可变数量的图像。

在主页上,我想在各自的部分中显示每个项目,并在各自的部分中显示每个项目的图像。目前,我已经显示了项目,并且能够在每个部分下显示数据库中的所有图像:

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

尽管浏览了文档、堆栈答案和网络帖子的页面,但我终其一生都无法弄清楚如何仅显示模板中每个相应部分的图像。

我已经看到了很多关于如何从视图/模型层查询这种类型关系中的模型的示例,但这些似乎都不适用于模板层。如果我要走那条路,我也不知道如何在不同的层上执行查询并将其发送到模板。

模型.py

class Project(models.Model):
title = models.TextField()
year = models.CharField(max_length=20)
tech = models.TextField()
role = models.TextField()
description = models.TextField()

def __str__(self):
    return self.title

class Image(models.Model):
name = models.TextField()
image = models.ImageField(upload_to='images/project_images/')
project = models.ForeignKey(to=Project, on_delete=models.CASCADE)

def __str__(self):
    return self.name

视图.py

def index(request):
home = Home.objects
projects = Project.objects
images = Image.objects

return render(request, 'portfolio/home.html', {'home': home,
                'projects': projects, 'images': images})

模板

{% for project in projects.all %}
<h2>{{ project.title }}</h2>
{{ project.tech|linebreaks }}

     {% for image in project.image_set.all %}
              <img src="{{ image.project_image.url }}" alt="">
     {% endfor %}

{% endfor %}

标签: pythondjangodjango-viewsdjango-templatesmany-to-one

解决方案


您可以将属性添加到项目模型中,并将“related_name”添加到项目 ForeignKey

模型.py

class Project(models.Model):
   title = models.TextField()
   year = models.CharField(max_length=20)
   tech = models.TextField()
   role = models.TextField()
   description = models.TextField()

   @property
   def get_images(self):
        return self.images.all()



class Image(models.Model):
   name = models.TextField()
   image = models.ImageField(upload_to='images/project_images/')
   project = models.ForeignKey(to=Project, related_name='images', on_delete=models.CASCADE)

然后在模板中,您可以调用项目对象,使用我们定义的属性来获取该项目对象的所有图像

模板

{% for image in  project.get_images %}
   #DO Something for each image
{% endfor %}

推荐阅读