Django与Algolia:使用Hogan和{% verbatim %}标签实现条件语句
解决Algolia Hit模板中{% if %}在verbatim标签内失效的问题
嘿,我正好碰到过类似的坑,来给你拆解下!首先得明确:你在{% verbatim %}标签里用{% if %}肯定不会生效——因为verbatim的核心作用就是告诉Algolia的模板引擎「别解析我里面的任何模板语法标记」,会把内容原封不动输出,所以{% if %}直接变成了普通文本,根本不会触发条件判断。
那是不是只用改JavaScript?其实有两种更灵活的解决方案,不一定非要全靠JS:
方案1:调整模板结构,把条件判断移出verbatim
如果你的verbatim只是用来包裹某一小段需要原样输出的内容(比如包含{{}}的第三方代码),那完全可以把{% if %}放在verbatim外面,只把需要原样输出的片段包进去就行。举个实际的例子:
<script type="text/html" id="hit-template"> {% if hit.is_paid %} <!-- 付费位专属布局 --> <div class="paid-listing"> <h3>{{ hit.title }}</h3> <span class="paid-badge">付费推荐</span> {% verbatim %} <!-- 这里的内容会原封不动输出,不会被模板引擎解析 --> <p>这段里的{{ 变量 }}不会被替换哦</p> {% endverbatim %} </div> {% else %} <!-- 普通位布局 --> <div class="regular-listing"> <h3>{{ hit.title }}</h3> </div> {% endif %} </script>
这样{% if %}在verbatim之外,就能被Algolia的模板引擎正常解析,同时保留你需要原样输出的内容。
方案2:用JavaScript的hitTemplate函数完全接管渲染
如果因为某些原因(比如整个模板都需要原样输出,或者模板结构太复杂)必须用verbatim,那确实可以通过修改JavaScript代码来解决——直接用JS的条件判断生成不同的HTML结构,完全绕开模板引擎的语法限制。
示例代码如下:
// 初始化Algolia搜索组件时,自定义hitTemplate函数 search.addWidgets([ instantsearch.widgets.hits({ container: '#hits', hitTemplate: function(hit) { // 用JS的if判断替代模板引擎的{% if %} if (hit.is_paid) { // 付费位的HTML结构,用模板字符串编写 return ` <div class="paid-listing"> <h3>${hit.title}</h3> <span class="paid-badge">付费推荐</span> <!-- 这里的内容直接写,不需要verbatim,模板字符串会原样输出非${}的内容 --> <p>付费专属展示位</p> </div> `; } else { // 普通位的HTML结构 return ` <div class="regular-listing"> <h3>${hit.title}</h3> </div> `; } } }) ]);
这种方式的好处是完全可控,所有渲染逻辑都在JS里,不需要纠结模板引擎的语法限制。
总结
- 不是必须只改JS:调整模板结构把条件判断移出verbatim是更直接的方案,适合大部分场景;
- 如果模板结构受限,用JS的hitTemplate函数接管渲染确实能解决问题,而且灵活性更高。
内容的提问来源于stack exchange,提问作者user7179686
相关产品推荐
相关产品推荐

