【问题标题】:Django template variable default value not workingDjango模板变量默认值不起作用
【发布时间】:2021-09-23 10:44:20
【问题描述】:

我正在使用 Django 3.2

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

这是我的代码 sn-p:

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

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

【问题讨论】:

标签: django django-templates


【解决方案1】:

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>

【讨论】:

  • 你能看看我的另一个问题here吗?我有一个即将到期的赏金,但尚未提交有用的答案。
【解决方案2】:

正如default 模板标签文档所述:

如果值评估为 False,则使用给定的默认值。否则,使用 价值。

【讨论】:

    【解决方案3】:

    这是因为0在python中是一个Falsy值,所以show_subscription_popup是False,而是使用默认值。

    假值:

    • 空列表 []
    • 空元组 ()
    • 空字典{}
    • 空集set()
    • 空字符串“”
    • 空范围 range(0)
    • 任何数字类型的零。
    • 整数:0
    • 浮点数:0.0
    • 复数:0j
    • 错误

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 2014-10-23
      • 2019-06-24
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多