在模板中访问ManyToManyField

时间:2020-10-07 18:58:21

标签: django django-models django-views

我正在尝试建立一个投资组合网站,当时的想法是建立一个包含多个图像实例的“项目”模型。我认为我能够通过使用“ ManyToManyField”关系来实现这一目标。

class Image(models.Model):
 image = models.ImageField(upload_to='media/')

class Project(models.Model):
  title = models.CharField(max_length=32)
  description = models.TextField(default='', null=False)
  stack = models.TextField(default='', null=False)
  image = models.ManyToManyField(Image, related_name='images')

  def __str__(self):
    return self.title

通过弄乱查询API,我已经能够检索图像的查询集,但是我不确定如何保持与它们的项目相关联并将其馈送到我的视图上下文中。我已经为我的Projects模型传递了al​​l()查询(很棒),但是我也想访问图像。

基本上,我希望我的HTML模板最终看起来像这样:

{% for project in projects %}
          <div class="card mx-auto" style="width: 50rem;">
            <img class="card-img-top" src="{{ project.images }}" alt=""> // Issue here
            <div class="card-body">
              <p>{{ project }}</p>
              <h5 class="card-title">{{project.title}}</h5>
              <p class="card-text">{{project.description}}</p>
              <p class="card-text">{{project.stack}}</p>
            </div>
          </div>
{% endfor %}

这是视图:

def portfolio_view(request, *args, **kwargs):
  p = Project.objects.all()
  for project in p:
    print('title: ', project.title)
    print('description: ', project.description)
    print('stack: ', project.stack)
    print('images: ', project.image.all())

  context = {
    'projects': Project.objects.all(),
  }
  return render(request, 'main/portfolio.html', context)

上下文对象上方的所有内容仅来自测试。

任何帮助将不胜感激!谢谢你!

1 个答案:

答案 0 :(得分:0)

由于您使用了ManyToMany字段,这意味着每个项目可以有很多图像(相反,每个图像可以有很多项目)。

在这种情况下,您需要在模板中执行以下操作:

{% for project in projects %}
  ...
  {% for image in project.images.all %}
    <img class="card-img-top" src="{{ image.image.url }}" alt="">
  {% endfor %}
  ...
{% endfor %}

假设我们每个项目只需要一个图像(每个图像只需要一个项目),即OneToOne字段。

您的模板如下所示:

{% for project in projects %}
  ...
  <img class="card-img-top" src="{{ project.image.image.url }}" alt="">
  ...
{% endfor %}