我在Django模板中遇到一个奇怪的问题。这是一个模板,用于显示文章列表,对于每个文章,我都显示一个被称为关键概念的关键字列表。
奇怪的是,它没有显示关键概念列表,而是显示了使用该关键概念的文章列表。
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 %}
注意:我使用了通用的详细视图
答案 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_
前缀。