2016-07-22 38 views
0

我使用Django開發webapp,我創建了不同的用戶角色,例如CunstomerUser, GoodUser, Admin ...等。Django中的不同角色:在網頁中顯示不同的內容

現在我想在他們登錄時向他們展示不同的東西。例如,當他們打開一個彈出窗口時,CustomerUser將看到一個textarea字段進行評論,而對於Admin,他會看到他可以做的其他事情。

我發現,我們可以做到這一點在template水平,如:

{% if request.user.is_superuser %} 
.... superuser content 
{% else %} 
.... non-superuser content 
{% endif %} 

但我怎麼能在使用本template JavaScript文件嗎?因爲我想向他們展示不同的功能取決於他們的角色。例如,我要確定在example.js包含在模板中的作用:

<html> 
<script type="text/javascript" src="example.js"></script> 
... 
</html> 

目前的解決方案,我發現是在模板創建一個變量全局JavaScript,使所有的javascipt的文件,可以使用:

<script> 
var userType = '{{user.get_usertype}}'; 
</scirpt> 

但是,他們是一個更好的方式來做到這一點?變量global不是很好使用,我想......也許我使用了轉儲模式設計。有任何想法嗎?謝謝!

+0

我認爲最正確的方法是檢查用戶在視圖中的角色,從而爲其呈現不同的模板。如果你的模板有許多共同的內容,你可以使用Django的'{%include%}'和'{%block%}'標籤來遵循DRY原則。 – Compadre

回答

2

我可能是錯的,但你仍然可以使用Django的模板語法在JavaScript中,因爲Django的模板加載頁面之前評估,所以它仍然通過隱藏/顯示自己相關的特定用戶的部分作品:

<script> 
{% if request.user.is_superuser %} 
    var userType = 'superuser'; 
{% else %} 
    var userType = 'normaluser'; 
{% endif %} 
</script> 

上面的代碼塊不一定是全局的,它可能發生在你的模板文件中的任何地方。在這種情況下,您總會得到一個userType的定義。

編輯:

好,避免全局變量的一點是,因爲他們可能會被其他的功能得到改變,因此值可能會搞砸。但是,如果你定義僞常量,那麼你應該沒問題。

JavaScript沒有常數,但你可以使用任何HTML與id來實現這一目標:

HTML:

<p style="display: none;" class="identity" id="{% if request.user.is_superuser %}superuser{% else %}normaluser{% endif %}"></p> 

example.js:

var user_role = $('p.identity').attr('id'); 

一個需要注意的是您需要在模板的末尾加載您的example.js,否則會在加載html之前加載,因此找不到該元素。

+0

對不起,沒有清楚地說出來......你能看到我上面的更新問題嗎?謝謝 –

+0

不,你可以使用模板+ JavaScript這種方式,它有時會變得非常複雜。無論如何+1 – e4c5

+0

我編輯了我的答案,這有點複雜,但看看它是否有意義。 –

相關問題