我使用的是 Django 3.2
我正在将一个布尔标志传递给我的基本模板中的 Javascript 函数。但是,设置变量后,我的模板逻辑中似乎仍在使用默认值。
这是我的代码片段:
urlpatterns = [
# ...
path('foo', TemplateView.as_view(template_name="foo.html", extra_context={'show_subscription_popup':0}), name='blog'),
path('admin/', admin.site.urls),
]
{% block content %}
<span>{{ show_subscription_popup}}</span>
{% endblock content %}
{% block body_js %}
<script type="text/js">
$().ready(function() {
let popDisplayed = '0';
if ({{ show_subscription_popup|default:1 }}){
popDisplayed = getCookie('popDisplayed');
}
/* remaining logic ... */
});
</script>
当我呈现页面时,我看到变量 show_subscription_popup
的正确值为 0,它被传递给 TemplateView,但是,在 javascript 中,代码如下所示:
if (1){
/* do something */
}
为什么默认值会覆盖我传递给模板的值,我该如何解决这个问题?
答案 0 :(得分:2)
您的 show_subscription_popup
变量的值为 0
。 documentation 中规定:
如果 value 计算为 False,则使用给定的默认值。否则, 使用该值。
如果你看到 bool(0)
是 False
,即 0
在 python 中是一个 falsey 值(实际上 False
实际上只是一个0
),因此呈现您的默认 1
。
请注意,这种渲染到 JavaScript 是一种不好的做法,会使您容易受到 XSS 攻击!相反,我会执行以下操作:
{% block content %}
<span id="show-subscription-popup" data-show-popup="{{ show_subscription_popup}}">{{ show_subscription_popup}}</span>
{% endblock content %}
{% block body_js %}
<script type="text/js">
$().ready(function() {
let popDisplayed = '0';
let showPopup = $("#show-subscription-popup").attr("data-show-popup");
if (showPopup.length == 0) {
showPopup = "1";
}
showPopup = parseInt(showPopup);
if (showPopup){
popDisplayed = getCookie('popDisplayed');
}
/* remaining logic ... */
});
</script>
答案 1 :(得分:1)
正如 default 模板标签文档所述:
<块引用>如果值评估为 False,则使用给定的默认值。否则,使用 价值。
答案 2 :(得分:1)
这是因为 0
在 python 中是一个 Falsy 值,所以 show_subscription_popup
是 False,而是使用默认值。
虚假值: