如何在Django模板if语句中使用自定义templatetag的返回值
解决方法
Django模板语法不支持直接在{% if %}语句中嵌套调用自定义simple_tag,你可以通过as关键字先将标签的返回值存储为模板临时变量,再用于判断,修改后的模板代码如下:
{% load validate_bookmark %} <!-- 先存储标签返回值 --> {% validate_bookmark post_obj request.user as is_bookmarked %} {% if is_bookmarked %} <button data-postpk="{{i.pk}}" class="fw-bold bookmarkBtn mx-3 n-border-outline n-border-outline far fa-bookmark px-0 py-0" style="font-size: 1.1rem;"></button> {% else %} <button data-postpk="{{i.pk}}" class="bookmarkBtn mx-3 n-border-outline n-border-outline far fa-bookmark px-0 py-0" style="font-size: 1.1rem;"></button> {% endif %}
优化建议
你可以将自定义标签改为过滤器形式,使用起来更简洁,不需要提前声明变量:
- 修改templatetag代码:
# validate_bookmark.py from django import template from user.models import Bookmark register = template.Library() @register.filter def is_bookmarked(post, user): # 用exists()替代first()判断,查询效率更高 return Bookmark.objects.filter(user=user, post=post).exists()
- 模板中直接在if语句内调用:
{% load validate_bookmark %} {% if post_obj|is_bookmarked:request.user %} <button data-postpk="{{i.pk}}" class="fw-bold bookmarkBtn mx-3 n-border-outline n-border-outline far fa-bookmark px-0 py-0" style="font-size: 1.1rem;"></button> {% else %} <button data-postpk="{{i.pk}}" class="bookmarkBtn mx-3 n-border-outline n-border-outline far fa-bookmark px-0 py-0" style="font-size: 1.1rem;"></button> {% endif %}
内容的提问来源于stack exchange,提问作者user14490044
相关产品推荐
相关产品推荐

