如何在同一数据上两次使用Django for循环

时间:2019-03-06 12:49:27

标签: python django

我正在尝试使用for循环在相同的Django模板中对相同的数据进行两次迭代。但是,第二个for循环仅返回数据库中的第一个对象。

基本上,我在主页上的数据库中都有每个作业的图像,单击该图像应该显示该作业的更详细说明。数据库中的所有作业都可以在首页上很好地显示,但是当它们被单击时,它们都将显示第一个作业的描述。

我认为这与只能使用一次迭代器有关,但我不知道解决方案是什么。

model.py

from django.db import models

class Job(models.Model):
    title = models.CharField(max_length=50, default="Example Work")
    image = models.ImageField(upload_to='images/')
    summary = models.TextField()

views.py

from django.shortcuts import render
from .models import Job

def get_index(request):
    jobs = Job.objects
    return render(request, 'index.html', {'jobs': jobs})

index.html

{% for job in jobs.all %}
  <div class="col-md-6 col-lg-4">
    <a class="portfolio-item d-block mx-auto" href="#portfolio-modal">
      <div class="portfolio-item-caption d-flex position-absolute h-100 w-100">
        <div class="portfolio-item-caption-content my-auto w-100 text-center text-white">
          <i class="fas fa-search-plus fa-3x"></i>
        </div>
      </div>
      <img class="img-fluid" src="{{ job.image.url }}" alt="">
    </a>
    <h3 class="text-center text-secondary">{{ job.title }}</h3>
  </div>
{% endfor %}
<!-- Portfolio Modal -->
{% for job in jobs.all %}
  <div class="portfolio-modal mfp-hide" id="portfolio-modal">
    <div class="portfolio-modal-dialog bg-white">
      <a class="close-button d-none d-md-block portfolio-modal-dismiss" href="#">
        <i class="fa fa-3x fa-times"></i>
      </a>
      <div class="container text-center">
        <div class="row">
          <div class="col-lg-8 mx-auto">
            <h2 class="text-secondary text-uppercase mb-0">{{ job.title }}</h2>
            <hr class="star-dark mb-5">
            <img class="img-fluid mb-5" src="{{ job.image.url }}" alt="Image of website">
            <p class="mb-5">{{ job.summary }}</p>
            <a class="btn btn-primary btn-lg rounded-pill portfolio-modal-dismiss" href="#">
              <i class="fa fa-close"></i>Close Project</a>
          </div>
        </div>
      </div>
    </div>
  </div>
{% endfor %}

仅出于上下文考虑,我从index.html中删除了很多html代码,因为它们都可以正常工作,并且可能无关紧要。我已经在一个无效的循环中尝试了它。说明将在同一页面上的新窗口中打开。我已经尝试了所有我能想到的东西,但是却一无所获。仍然可以使用Django和Python。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

这与Django在每次迭代中输出相同的数据无关。如果您通过浏览器中的“查看源代码”检查生成的HTML,则肯定会看到正确的数据。

问题出在您的HTML本身。您不能有多个具有相同HTML id属性的元素;但您每个人都使用id="portfolio-modal"。当您的JS尝试弹出模式时,它只会找到该ID的第一个实例。

您需要在每次迭代中使用不同的ID-也许通过添加一个唯一的元素(例如Job pk)和/或使用一个类来触发模态。