在 Django 模板中突出显示 post
Highlighted post in Django templates
我创建了这个模型:
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 来放入 div响应 true.
如何设置"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):
class MyPostView(ListView):
model = PostModel
<b>queryset = PostModel.objects.filter(post_highlighted=True)</b>
# ...
现在 object_list
将只包含 PostModel
个具有 post_highlighted = True
的对象。
如果你使用另一个视图,你自己构造 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-level 处进行过滤,这通常会慢很多。
想象一下,如果突出显示一百个帖子中的两个。然后通过不在数据库级别进行过滤,将所有一百个帖子的数据传输到 Django,进行反序列化,循环这些,并几乎立即丢弃 98 个非突出显示。这是白费功夫。
Note: typically models have no Model
suffix. I advise you to rename the model to Post
.
你可以用简单的 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 %}
我创建了这个模型:
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 来放入 div响应 true.
如何设置"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):
class MyPostView(ListView):
model = PostModel
<b>queryset = PostModel.objects.filter(post_highlighted=True)</b>
# ...
现在 object_list
将只包含 PostModel
个具有 post_highlighted = True
的对象。
如果你使用另一个视图,你自己构造 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-level 处进行过滤,这通常会慢很多。
想象一下,如果突出显示一百个帖子中的两个。然后通过不在数据库级别进行过滤,将所有一百个帖子的数据传输到 Django,进行反序列化,循环这些,并几乎立即丢弃 98 个非突出显示。这是白费功夫。
Note: typically models have no
Model
suffix. I advise you to rename the model toPost
.
你可以用简单的 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 %}