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

如何在Django simple_tag中使用Verbatim避免Handlebars变量被渲染

错误原因说明

verbatim标签只能让Django不解析它包裹的顶层内容,不能嵌套在Django标签{% ... %}内部使用,Django解析标签参数时会把内部的{% verbatim %}识别为无效参数,所以你的尝试无法生效。
另外你还存在一个根本性的逻辑矛盾:Django的simple_tag是服务端渲染阶段执行的,而Handlebars的{{value}}是客户端JS运行阶段才会被替换的变量。你把{{value}}传给服务端的iswatched标签时,服务端拿到的只是字符串"{{value}}",根本不可能匹配到数据库里的movieDB_id,永远会返回False,哪怕语法没问题也达不到你要的效果。


推荐解决方案(符合前后端渲染逻辑)

建议直接在前端用Handlebars自定义helper实现判断,避免语法和逻辑冲突:

  1. 先在Django模板中提前把所有已看的电影ID输出到全局JS变量,所有Handlebars代码用verbatim包裹
<script>
// 服务端渲染时输出当前用户所有已看的电影ID数组
const WATCHED_MOVIE_IDS = [
    {% for movie in request.user.watched_titles.all %}
        {{ movie.movieDB_id }}{% if not forloop.last %},{% endif %}
    {% endfor %}
];
</script>

{% verbatim %}
<script id="movie-template" type="text/x-handlebars-template">
  <!-- 直接用Handlebars的自定义helper判断 -->
  {{#if (isWatched movieDB_id)}}
    <span class="watched-tag">已观看</span>
  {{/if}}
</script>
{% endverbatim %}
  1. 自定义Handlebars helper实现判断逻辑
Handlebars.registerHelper('isWatched', function(movieDB_id) {
  return WATCHED_MOVIE_IDS.includes(Number(movieDB_id));
});

仅解决语法冲突的方案(不解决逻辑问题)

如果你确实只需要让Django不解析{{value}},把它作为普通字符串传给iswatched标签,可以用Django内置的templatetag标签输出原生变量定界符:

{% iswatched templatetag openvariable %}value{% templatetag closevariable as watched %}

内容的提问来源于stack exchange,提问作者AmirHossein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:02