Django模板变量默认值不起作用

时间:2021-07-14 12:42:52

标签: django django-templates

我使用的是 Django 3.2

我正在将一个布尔标志传递给我的基本模板中的 Javascript 函数。但是,设置变量后,我的模板逻辑中似乎仍在使用默认值。

这是我的代码片段:

/path/to/urls.py

urlpatterns = [
                # ...
                path('foo', TemplateView.as_view(template_name="foo.html", extra_context={'show_subscription_popup':0}), name='blog'),   

                path('admin/', admin.site.urls),                  
              ] 

/path/to/foo.html

{% 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 */
}

为什么默认值会覆盖我传递给模板的值,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

您的 show_subscription_popup 变量的值为 0documentation 中规定:

<块引用>

如果 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,而是使用默认值。

虚假值:

  • 空列表[]
  • 空元组 ()
  • 空字典{}
  • 空集 set()
  • 空字符串""
  • 空范围范围(0)
  • 任何数字类型的零。
  • 整数:0
  • 浮动:0.0
  • 复杂:0j
  • 错误
相关问题