python - Django 模板中突出显示的帖子
问题描述
我创建了这个模型:
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 %}
解决方案
不要在模板中执行此操作,您可以更改queryset
(ListView
基于object_list
我假设您使用一个ListView
或至少一个相关类):
class MyPostView(ListView):
model = PostModel
queryset = PostModel.objects.filter(post_highlighted=True)
# ...
现在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
WHERE post_highlighted = TRUE
数据库通常可以有效地搜索此类记录,而且我们避免在 Django/Python 级别进行过滤,这通常会慢一个数量级。
想象一下,如果突出显示一百个帖子中的两个帖子。然后通过不在数据库级别进行过滤,您将所有一百个帖子的数据传输到 Django,进行反序列化,循环这些,并几乎立即丢弃 98 个未突出显示的内容。这是很多工作都是徒劳的。
注意:通常型号没有
Model
后缀。我建议您将模型重命名为Post
.
推荐阅读
- c - rand 函数在每次运行时都给我相同的结果,即使我调用了 srand(time(NULL))
- python - 使用 TQDM 几乎使我的 GET 请求的文件大小翻了一番
- alignment - 对 bam 文件进行二次采样以仅包含长度超过 X 的读取
- vb.net - VB.NET 从列表中沿 X 坐标移动直线的所有点
- arrays - Mongo DB 在多个嵌套数组的数组中查找值
- javascript - 将八进制字符串解析为整数javascript
- c - 指向字符数组的指针
- android - 如何在安卓上执行二维码?
- unity3d - 我不小心把我的 2D 对撞机放在了主相机上,而不是我的 Maze Sprite
- javascript - 使用递归迭代数组的 Closure