You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 %}

优化建议

你可以将自定义标签改为过滤器形式,使用起来更简洁,不需要提前声明变量:

  1. 修改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()
  1. 模板中直接在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 04:54:02