Django 2.1 如何使用自定义函数显示上下文
Django 2.1 how to use custom function to display context
我有一个侧边栏,显示流行的 post,按他们的评论数量排序。
在模板中使用 {{ post.message_html|truncatechars:60|safe }}
显示 post 的内容。
要获得 popular_posts
我使用 context_processors.py:
def get_popular_posts(request):
context = {}
context["popular_posts"] = (
Post.objects.all()
.annotate(comments_count=Count("comments"))
.order_by("-comments_count")[:3]
)
return context
如何让每个 popular_posts
的某些自定义函数(相同)处理 post.message_html
?这个函数应该写在哪里?
models.py:
class Post(models.Model):
user = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
message_html = models.TextField(editable=False)
group = models.ForeignKey(
Group, related_name="posts", null=True, blank=False, on_delete=models.CASCADE
)
def __str__(self):
return self.message
def save(self, *args, **kwargs):
self.message_html = misaka.html(self.message)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"posts:single", kwargs={"username": self.user.username, "pk": self.pk}
)
class Meta:
ordering = ["-created_at"]
unique_together = ["user", "message"]
这是我在其他模板中包含的 .html 模板:
<div class="left-bar">
<h4 style="text-align: center;">POPULAR POSTS:</h4>
<hr>
{% for post in popular_posts %}
<div class="jumbotron">
<a href="{% url 'posts:single' username=post.user.username pk=post.pk %}">{{ post.message_html|truncatechars:60|safe }}</a>
<hr>
<span class="text-muted popular">
<p>comments: {{ post.comments.count }}</p>
<p>author: {{ post.user.username }}</p>
</span>
</div>
{% endfor %}
</div>
您可以为此目的创建自定义模板标签或过滤器。
docs.
模板过滤器可以像{{ post.message_html|truncatechars:60|safe|process_message }}
一样使用
# /app/templatetags/utils.py
register = template.Library()
@register.filter(name='process_message')
def process_message(value):
# do something
return result #return processed message
我有一个侧边栏,显示流行的 post,按他们的评论数量排序。
在模板中使用 {{ post.message_html|truncatechars:60|safe }}
显示 post 的内容。
要获得 popular_posts
我使用 context_processors.py:
def get_popular_posts(request):
context = {}
context["popular_posts"] = (
Post.objects.all()
.annotate(comments_count=Count("comments"))
.order_by("-comments_count")[:3]
)
return context
如何让每个 popular_posts
的某些自定义函数(相同)处理 post.message_html
?这个函数应该写在哪里?
models.py:
class Post(models.Model):
user = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
message_html = models.TextField(editable=False)
group = models.ForeignKey(
Group, related_name="posts", null=True, blank=False, on_delete=models.CASCADE
)
def __str__(self):
return self.message
def save(self, *args, **kwargs):
self.message_html = misaka.html(self.message)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
"posts:single", kwargs={"username": self.user.username, "pk": self.pk}
)
class Meta:
ordering = ["-created_at"]
unique_together = ["user", "message"]
这是我在其他模板中包含的 .html 模板:
<div class="left-bar">
<h4 style="text-align: center;">POPULAR POSTS:</h4>
<hr>
{% for post in popular_posts %}
<div class="jumbotron">
<a href="{% url 'posts:single' username=post.user.username pk=post.pk %}">{{ post.message_html|truncatechars:60|safe }}</a>
<hr>
<span class="text-muted popular">
<p>comments: {{ post.comments.count }}</p>
<p>author: {{ post.user.username }}</p>
</span>
</div>
{% endfor %}
</div>
您可以为此目的创建自定义模板标签或过滤器。 docs.
模板过滤器可以像{{ post.message_html|truncatechars:60|safe|process_message }}
# /app/templatetags/utils.py
register = template.Library()
@register.filter(name='process_message')
def process_message(value):
# do something
return result #return processed message