Skip to main content
 首页 » 编程设计

python之Django 模板中突出显示的帖子

2025年05月04日27zfyouxi

我创建了这个模型:

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"  

我想使用 post_highlighted 将文章或响应为 true 的文章放入 div。

如何设置“for cicle”?

这里是显示帖子列表的圆圈:

{% for posts in object_list %} 
 
<div id="bloghome" class="container"> 
  <h1><a href="{{ posts.get_absolute_url }}">{{ posts.post_title }}</a></h1> 
  <p>{{ posts.post_short_description|safe|linebreaks }}</p> 
  <p>Pubblicato il <strong>{{ posts.post_publishing_date|date }}</strong></p> 
  <h5>Keywords:</h5> 
    {% for keyword in object_list.all %} 
      <button type="button" class="btn btn-outline-warning btn-sm">{{ keyword }}</button> 
    {% endfor %} 
</div> 
<hr> 
 
{% empty %} 
 
  <h1>Go to the admin panel and create your first post!</h1> 
 
{% endfor %} 

请您参考如下方法:

不要在模板中这样做,您可以更改 ListView 的 queryset(基于 object_list 我假设您使用 ListView 或至少一个相关的类):

class MyPostView(ListView): 
 
    model = PostModel 
    <b>queryset = PostModel.objects.filter(post_highlighted=True)</b> 
 
    # ...

现在 object_list 将只包含 PostModel 对象,并且 post_highlighted = True。

如果您使用另一个 View ,您自己构造 object_list,您可以这样写:

object_list = PostModel.objects.filter(post_highlighted=True) 

所以只要 object_list 包含突出显示的 PostModel 对象,我们就没问题。

在 queryset 级别执行此操作的优势在于,我们将查询数据库 以查找突出显示的 PostModel 对象。因此,我们执行查询:

SELECT postmodel.* 
FROM postmodel 
<b>WHERE post_highlighted = TRUE</b>

数据库通常可以有效地搜索此类记录,而且我们避免在 Django/Python 级别进行过滤,这通常会慢很多。

想象一下,如果突出显示一百个帖子中的两个。然后通过不在数据库级别进行过滤,将所有一百个帖子的数据传输到 Django,进行反序列化,循环这些,并几乎立即丢弃 98 个非突出显示。这是白费功夫。

Note: typically models have no Model suffix. I advise you to rename the model to Post.