Python 对象列表在模板中未显示正确的数据
Django模板中有一个奇怪的问题。这是一个显示文章列表的模板,对于每个人,我都会显示一个我称之为关键概念的关键字列表 奇怪的是,它没有列出关键概念,而是列出了使用该关键概念的文章 下面是我的项目的E/R图、模型和模板: Models.pyPython 对象列表在模板中未显示正确的数据,python,django,python-3.x,web,django-2.1,Python,Django,Python 3.x,Web,Django 2.1,Django模板中有一个奇怪的问题。这是一个显示文章列表的模板,对于每个人,我都会显示一个我称之为关键概念的关键字列表 奇怪的是,它没有列出关键概念,而是列出了使用该关键概念的文章 下面是我的项目的E/R图、模型和模板: Models.py class KeyConceptModel(models.Model): concept_text = models.CharField(max_length=50) def __str__(self): return s
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 %}
{%for object_list%}
《出版日报》{{posts.post_publishing_date | date}}
{object_list.all%}中关键字的%
{{关键字}}
{%endfor%}
{{posts.post_short_description | safe | linebreaks}
{%empty%}
转到管理面板,创建您的第一篇帖子!
{%endfor%}
注意:我已经使用了通用细节视图
您可以在模板中编写:
<!-- this will iterate again over the same list -->
{% for keyword in object_list.all %}
<p>{{ keyword }}</p>
{% endfor %}
由于您希望呈现所有帖子的关键概念
,因此最好在列表视图中使用.prefetch\u related(..)
,以便在恒定数量的查询中获取关键字
,因此:
类ListPostGDV(ListView):
模型=后模型
queryset=PostModel.objects.prefetch\u-related('post\u-keyconcept'))
#…
注意:通常模型名称为单数,没有Model
后缀,因此Post
而不是PostModel
,以及KeyConcept
而不是KeyConceptModel
注意:由于您迭代了对象列表
(在外循环中),该项目是一篇文章,因此我建议将其命名为文章
,而不是文章
,否则只会引起混淆
注意:在所有属性前面加上post
,这有点多余。例如,当两个模型具有name
属性,并且您希望函数能够同时处理这两个属性时,它还可以防止使用duck类型。因此,我建议删除属性的post
前缀
你能分享一下列表视图的相关部分吗?我现在已经做了,我已经编辑了第一篇文章来添加列表视图。当我使用您的指示时,会显示以下消息:“在PostModel对象上找不到'key_concepts','key_concepts'是预取_related()的无效参数。”。怎么了?关于您添加的注释,您是正确的,但这是我在Django的第一个项目,这种类型的命名对我在开发阶段很重要。在这一阶段之后,我将使用您的指示来获得正确的命名。@Massimilianomaraca:ha,它是post_keyconcept
:),因为您可以看到前缀的东西确实令人困惑。例如,中描述了上述一些样式。虽然人们不必使用它(在没有它的情况下,程序可以工作,这通常对习惯样式的人来说比较困难):)呃……现在我没有显示任何错误,但是在模板中没有显示关键概念。我想我最好按照你的指示去做,我也会去纠正前缀,因为我也开始把自己弄糊涂了感谢您的指示:)@Massimilianomaraca:您也编辑了模板吗(这是同样的错误,应该是posts.post\u keyconcept.all
)。我已经按照您的指示重新创建了所有项目,现在我可以确认它现在运行了。谢谢:)
{% for keyword in posts.post_keyconcept.all %}
<p>{{ keyword }}</p>
{% endfor %}