【问题标题】:Object_list does not show correct data in templateObject_list 未在模板中显示正确的数据
【发布时间】:2019-02-14 00:06:20
【问题描述】:

我在 Django 模板中有一个奇怪的问题。这是一个显示文章列表的模板,我为每个人展示了一个我称之为关键概念的关键字列表。

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

在我的项目的 E/R 图和模型和模板下面:

模型.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 %}

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

【问题讨论】:

  • 可以分享ListView的相关部分吗?
  • 我已经完成了

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


【解决方案1】:

在您的模板中编写:

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

但这里object_list 是您的文章QuerySet。您调用.all() 的事实仅意味着for 循环将再次 迭代所有PostModels(.all() 用于明确表明您不进行过滤)。

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

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

由于您要渲染所有posts 中的key_concepts,最好在ListView 中使用.prefetch_related(..),这样keywords 会在恒定数量的查询中被获取,所以:

class ListPostGDV(ListView):
    model = PostModel
    queryset = PostModel.objects.prefetch_related('post_keyconcept')

    # ...

注意:通常模型名称是单数且没有Model 后缀,所以Post 代替PostModelKeyConcept 代替KeyConceptModel

 

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

 

注意:您在所有属性前加上post_,这有点多余。例如,当两个模型具有name 属性并且您希望该函数能够同时处理两者时,它还可以防止使用 duck typing。因此我建议删除属性的post_ 前缀。

【讨论】:

  • 我已经编辑了第一篇文章以添加 ListView。当我使用您的指示时,会显示此消息:“在 PostModel 对象上找不到 'key_concepts','key_concepts' 是 prefetch_related() 的无效参数”。怎么了?关于您添加的注释,您是正确的,但这是我在 Django 中的第一个项目,这种命名对我在开发阶段很重要。在此阶段之后,我将根据您的指示进行正确命名。
  • @MassimilianoMoraca: 哈,它是post_keyconcept :) 因为你可以看到前缀的东西真的很混乱。上面提到的一些样式例如在PEP-8 中描述。尽管不必使用它(从某种意义上说,程序没有它就可以工作,但习惯了样式的人通常更难):)
  • eh...现在我没有显示任何错误,但在模板中没有显示关键概念。我认为我最好按照你的指示去纠正前缀,因为我也开始困惑自己! :S 谢谢你的指点 :)
  • @MassimilianoMoraca:你是否也编辑了模板(同样的错误,应该是posts.post_keyconcept.all)。
  • 我已经按照您的指示重新创建了所有项目,现在我可以确认它现在可以运行了。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2021-12-07
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多