【问题标题】:Highlighted post in Django templatesDjango 模板中突出显示的帖子
【发布时间】:2019-02-06 20:36:29
【问题描述】:

我已经创建了这个模型:

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”?

这里有显示帖子列表的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 %}

【问题讨论】:

  • 我不知道“for cicle”是什么意思。但是您为什么不在视图中通过post_highlighed=True 过滤查询集来执行此操作?

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


【解决方案1】:

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

class MyPostView(ListView):

    model = PostModel
    queryset = PostModel.objects.filter(post_highlighted=True)

    # ...

现在object_list 将只包含带有post_highlighted = TruePostModel 对象。

如果你使用另一个视图来自己构造object_list,你可以这样写:

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

只要object_list 包含突出显示的PostModel 对象,我们就可以了。

queryset 级别执行此操作的好处是我们将查询数据库 以查找突出显示的PostModel 对象。因此我们执行一个查询:

SELECT postmodel.*
FROM postmodel
WHERE post_highlighted = TRUE

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

想象一下,如果一百个帖子中有两个被突出显示。然后通过不在数据库级别进行过滤,您将所有一百个帖子的数据传输到 Django,进行反序列化,循环这些,并几乎立即丢弃 98 个未突出显示的内容。很多工作都是徒劳的。

注意:通常模型没有Model 后缀。我建议您将模型重命名为Post

【讨论】:

  • 如果我理解了,在这种模式下,我只能显示突出显示为 True 的帖子。其他类型的帖子没有显示,对吧?注意:是的,我使用了通用列表视图
  • 是的,如果你想显示所有帖子,并对突出显示的帖子做一些“特别”的事情,你可以编写模板逻辑。
【解决方案2】:

你可以用简单的 if 语句来做到这一点

{% for posts in object_list %}
  {% if posts.post_highlighted %}
    <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>
  {% endif %}
{% endfor %}

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 2021-11-29
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2019-12-31
    • 2021-01-13
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多