如何在Django simple_tag中使用Verbatim避免Handlebars变量被渲染
错误原因说明
verbatim标签只能让Django不解析它包裹的顶层内容,不能嵌套在Django标签{% ... %}内部使用,Django解析标签参数时会把内部的{% verbatim %}识别为无效参数,所以你的尝试无法生效。
另外你还存在一个根本性的逻辑矛盾:Django的simple_tag是服务端渲染阶段执行的,而Handlebars的{{value}}是客户端JS运行阶段才会被替换的变量。你把{{value}}传给服务端的iswatched标签时,服务端拿到的只是字符串"{{value}}",根本不可能匹配到数据库里的movieDB_id,永远会返回False,哪怕语法没问题也达不到你要的效果。
推荐解决方案(符合前后端渲染逻辑)
建议直接在前端用Handlebars自定义helper实现判断,避免语法和逻辑冲突:
- 先在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 %}
- 自定义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
相关产品推荐
相关产品推荐

