python - Object_list 未在模板中显示正确的数据
问题描述
我在 Django 模板中有一个奇怪的问题。这是一个显示文章列表的模板,我为每个人展示了一个我称之为关键概念的关键字列表。
奇怪的是,它显示的不是关键概念列表,而是使用该关键概念的文章列表。
模型.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"
视图.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 %}
注意:我使用了通用的详细视图
解决方案
在您的模板中,您编写:
<!-- this will iterate again over the same list -->
{% for keyword in object_list.all %}
<p>{{ keyword }}</p>
{% endfor %}
但这object_list
是你QuerySet
的文章。您调用的事实.all()
仅意味着for
循环将因此再次遍历所有PostModel
s (以及.all()
用于明确表示您不进行过滤)。
如果要遍历 ,则post_keyconcept
需要调用posts.post_keyconcept.all
:
{% for keyword in posts.post_keyconcept.all %}
<p>{{ keyword }}</p>
{% endfor %}
由于您要呈现key_concepts
of all posts
,因此最好.prefetch_related(..)
在 中使用 ,ListView
以便keywords
在恒定数量的查询中获取 ,因此:
class ListPostGDV(ListView):
model = PostModel
queryset = PostModel.objects.prefetch_related('post_keyconcept')
# ...
注意:通常模型的名称是单数并且没有
Model
后缀,所以Post
代替PostModel
, 和KeyConcept
代替KeyConceptModel
.
注意:由于您迭代
object_list
(在外循环中)该项目是一个帖子,所以我建议将其命名为post
,而不是posts
,否则只会引入混乱。
注意:您为所有属性添加前缀,
post_
这有点多余。例如,当两个模型具有一个属性并且您希望该函数能够同时处理这两个模型时,它还可以防止使用鸭子类型。name
因此我建议删除post_
属性的前缀。
推荐阅读
- java - java程序找不到符号类Node但我导入了它
- r - readr:传递一串列类
- vue.js - vue-devtools 总是被 nuxt.js 禁用
- c - 预处理器运算符“定义”的优先级?
- python - 如何从字典中编写一个文本文件,其中每个键都是一个新行?
- node.js - 如何在现有的 Express 应用程序中使用 Electron
- python - 为什么 Python sys.version_info 缺少 _asdict() 方法来转换为字典?
- c++ - C ++ 17折叠表达式未编译
- oracle - ORACLE 不显示所有记录
- django-channels - builtins.RuntimeWarning:从未等待协程“SyncToAsync.__call__”