Django生成JS变量报错Uncaught SyntaxError: Unexpected token true求助
解决Django模板生成JS变量的语法错误问题
你的问题核心是模板字符串的引号冲突导致JS代码解析失败,而且因为是语法解析阶段的错误,try/catch确实无能为力——毕竟代码都没被正确解析,根本到不了运行时的捕获逻辑。
下面给你几个靠谱的解决方案:
方案1:直接生成JS布尔值(推荐)
既然你要的是一个布尔状态,没必要用字符串,直接输出JS原生的true/false就好,这样完全避免引号问题:
WHETHER_DJANGO_USER_IS_AUTH = {{ user.is_authenticated|yesno:"true,false" }};
渲染后会直接变成:
// 已认证用户 WHETHER_DJANGO_USER_IS_AUTH = true; // 未认证用户 WHETHER_DJANGO_USER_IS_AUTH = false;
这是最规范的写法,JS解析完全没问题。
方案2:用单引号避免引号冲突
如果一定要用字符串形式,可以把包裹模板变量的双引号改成单引号,这样内部yesno过滤器的双引号就不会和外层冲突:
WHETHER_DJANGO_USER_IS_AUTH = '{{ user.is_authenticated|yesno:"true, false" }}';
渲染后结果是合法的JS字符串:
WHETHER_DJANGO_USER_IS_AUTH = 'true'; // 或 'false'
方案3:转义特殊字符(更严谨)
如果场景更复杂(比如输出内容包含特殊字符),可以用Django的escapejs过滤器确保输出的字符串符合JS语法规范,同时用单引号作为yesno的参数分隔符:
WHETHER_DJANGO_USER_IS_AUTH = "{{ user.is_authenticated|yesno:'true,false'|escapejs }}";
为什么原来的代码会报错?
你原来的写法:
WHETHER_DJANGO_USER_IS_AUTH = "{{user.is_authenticated|yesno:"true, false"}}";
这里的问题是模板引擎会把内部的双引号当成外层字符串的结束标记,导致解析混乱。最终输出的JS代码大概率是语法不完整的(比如未闭合的引号),JS引擎在解析阶段就会抛出Unexpected token错误——这种错误发生在代码执行前,所以try/catch根本无法捕获。
内容的提问来源于stack exchange,提问作者user8967235
相关产品推荐
相关产品推荐

