2012-09-12 20 views
9

下面是代碼在我base.html文件頭我的Django的模板布爾變量無法正常運行的JavaScript

<script> 
     var auth_status = "{{ user.is_authenticated }}" 
    </script> 

    {% block scripts %} {% endblock %} 

在我的網站上的腳本的其餘都在腳本塊。

在子模板(腳本塊內和腳本標籤中)我有這樣的代碼,

  if (auth_status) { 
      //something 
     } 

眼下的錯誤的auth_status始終是真實的,當它應該是開啓和關閉取決於如果用戶已登錄。Request_context正在傳遞給模板,因此不應該是錯誤。

感謝

+2

悅目無關你的問題,但要注意不是做'如果(user_is_authenticated){做的東西;如果你真的依賴這個JS變量的值,''可能是一個安全問題。用戶可以在執行之前修改JS變量的值。 –

+0

所以你說用戶可以以某種方式設置auth_status = true?那麼繞過js var是一個有效的解決方法?例如:if({{user.is_authenticated | yesno:「true,false」}})與if(auth_status)? –

+1

惡意用戶可能只是拉你的網頁的源代碼,並用他們想要的任何東西替換他們想要的任何東西。有**沒有**方式可以實現任何**安全客戶端(即在JS中)並且有**沒有解決方法**,所有安全/訪問控制必須完成服務器端(即在你的Python代碼中)。 JS不是你的動態執行的應用程序代碼的擴展,它是*不同的*,具有不同的約束。 –

回答

52

對於我所看到的你auth_status變量似乎是一個字符串,而不是一個布爾值。 javascript上的非空字符串的變量將在if子句中計算爲true

總之,像

<script> 
    var auth_status = {{ user.is_authenticated }}; 
</script> 

不會工作,因爲這將產生此HTML:

<script> 
    var auth_status = True; 
</script> 

由於Python的真布爾是大寫的。

這應該在Python做翻譯爲Javascript:

<script> 
    var auth_status = {{ user.is_authenticated|yesno:"true,false" }}; 
</script> 

檢查YESNO文檔瀏覽:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno

+1

+1好的答案,並很好的使用'yesno'。 –

+0

哇!非常感謝,我完全忽略了兩種語言中的大寫/小寫差異! –

+0

將Python變量傳遞給JS變量的更通用的解決方案是使用json。在py:context ['foo'] = json.dumps(a_py_list)。在模板。這將適用於大多數數據結構,也適用於布爾值。 – Sean