2016-07-22 7 views
0

私はWebアプリケーションを開発するためにDjangoを使用しています。私はユーザーの異なる役割を作成しました。例えばCunstomerUser, GoodUser, Admin ...などです。Djangoのさまざまな役割:Webページの異なるコンテンツを表示

ここでは、ログイン時にさまざまなことを示したいと思います。たとえば、ポップアップを開くと、CustomerUserにはコメント用のテキストエリアが表示され、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> 

私が見つけた現在のソリューションは、すべてのjavasciptファイルが使用できるように、テンプレートに変数グローバルJavaScriptを作成することです:

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

これを行うより良い方法はありますか?変数のグローバルは私が思うに使用するのはあまり良くありません...多分私はダンプパターンの設計を使用しました。何か案は?ありがとう!

+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の定義が1つだけ得られます。

編集:値が台無しかもしれないので、彼らは他の関数によって変更される可能性がありますので

はまあ、避けるグローバル変数のポイントです。しかし、疑似定数を定義すると、うまくいくはずです。

Javascriptが定数を持っていませんが、あなたはそれを達成するためにidを持つ任意のHTMLを使用することができます。

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'); 

1つの警告がありますテンプレートの末尾にexample.jsをロードする必要があります。そうしないと、htmlが読み込まれる前にロードされるため、要素が見つかりませんでした。

+0

私は更新の質問を上に見ることができますか?ありがとう –

+0

いいえ、あなたは時々ひどく複雑になるこの方法でテンプレート+ JavaScriptを使用することができます。とにかく+1 – e4c5

+0

私は私の答えを編集しました、少し畳み込まれていますが、意味があるかどうかを確認してください。 –

関連する問題