Object_list在模板中未显示正确的数据

时间:2018-09-09 08:45:34

标签: python django python-3.x web django-2.1

我在Django模板中遇到一个奇怪的问题。这是一个模板,用于显示文章列表,对于每个文章,我都显示一个被称为关键概念的关键字列表。

奇怪的是,它没有显示关键概念列表,而是显示了使用该关键概念的文章列表。

在我的项目的E / R图,模型和模板下面: enter image description here

Models.py

class KeyConceptModel(models.Model):
    concept_text = models.CharField(max_length=50)

    def __str__(self):
        return self.concept_text

    def get_absolute_url(self):
        return reverse("keyconceptManuscriptusView", kwargs={"pk": self.pk})

    class Meta: 
        verbose_name = "Concetto chiave"
        verbose_name_plural = "Concetti chiave"  

class PostModel(models.Model):
    post_title = models.CharField(max_length=70)
    post_short_description = models.TextField(max_length=200)
    post_contents = models.TextField()
    post_publishing_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    post_author = models.ForeignKey(AuthorModel, on_delete=models.CASCADE)
    post_keyconcept = models.ManyToManyField(KeyConceptModel)
    slug = models.SlugField(verbose_name="Slug", unique="True")
    post_highlighted = models.BooleanField(default=False)

    def __str__(self):
        return self.post_title

    def get_absolute_url(self):
        return reverse("singlepostManuscriptusView", kwargs={"slug": self.slug})

    class Meta: 
        verbose_name = "Articolo"
        verbose_name_plural = "Articoli" 

Views.py

class ListPostGDV(ListView):
    model = PostModel
    template_name = "manuscriptus_home.html"

模板

{% for posts in object_list %}
  <div id="news" class="container">
    <div class="row">
      <img class="img-fluid" src="{% static 'manuscriptus/img/demo_img.png' %}" alt="Header image">
    </div>
    <div class="row">
      <div class="col-3">
        <div class="row">
          <small class="text-muted">Pubblicato il <strong>{{ posts.post_publishing_date|date }}</strong></small>
        </div>
        <div class="row">
          {% for keyword in object_list.all %}
              <p>{{ keyword }}</p>
          {% endfor %}
        </div>
      </div>
      <div class="col-9">
        <div class="row">
          <p class="h3"><a href="{{ posts.get_absolute_url }}">{{ posts.post_title }}</a></p>
        </div>
        <div class="row">
          <p class="h5">{{ posts.post_short_description|safe|linebreaks }}</p>
        </div>
      </div>
    </div>
  </div>
{% empty %}
  <div id="news" class="container">
    <h1>Go to the admin panel and create your first post!</h1>
  </div>
{% endfor %}
  

注意:我使用了通用的详细视图

1 个答案:

答案 0 :(得分:2)

在模板中编写:

<!-- this will iterate again over the same list -->
{% for keyword in object_list.all %}
    <p>{{ keyword }}</p>
{% endfor %}

但是这里object_list是您的文章QuerySet。您调用.all()的事实仅意味着for循环将因此再次 遍历所有PostModel(好了.all()用于明确表示您不进行过滤。

如果要遍历post_keyconcept,则需要调用posts.post_keyconcept.all

{% for keyword in posts.post_keyconcept.all %}
    <p>{{ keyword }}</p>
{% endfor %}

由于您要呈现所有key_concepts的{​​{1}},因此最好在posts中使用.prefetch_related(..),以使ListView以常量获取查询数,因此:

keywords
  

注意:通常,模型名称为单数形式,不带后缀class ListPostGDV(ListView): model = PostModel queryset = PostModel.objects.prefetch_related('post_keyconcept') # ...,因此,Model代替Post,而PostModel代替的KeyConcept

  

注意:由于您遍历KeyConceptModel(在外部循环中),因此该项目是单个帖子,因此我建议将其命名为object_list,而不是{{ 1}},因为否则只会引起混乱。

  

注意:为所有属性添加post前缀,这有点多余。例如,当两个模型都具有posts属性,并且您希望函数能够同时处理这两个模型时,它还会阻止使用鸭子键入。因此,我建议删除属性的post_前缀。