【问题标题】:Accessing a ManyToManyField in template访问模板中的 ManyToManyField
【发布时间】:2020-10-07 18:58:21
【问题描述】:

我正在尝试建立一个投资组合网站,我的想法是拥有一个包含多个图像实例的“项目”模型。我认为我能够通过使用“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 模型传入了 all() 查询(这很棒),但我也想访问图像。

基本上,我希望我的 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)

上下文对象之上的任何东西都只是来自测试。

任何帮助将不胜感激!非常感谢!

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    由于您使用了 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 %}
    

    【讨论】:

    • 啊!我没想到要循环播放图像……不错!非常感谢。
    猜你喜欢
    • 2021-10-10
    • 2019-05-24
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2014-11-22
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多