Djangoで読み込むテンプレートを条件分岐させる方法のイメージ画像

Djangoで読み込むテンプレートを条件分岐させる方法

  • 公開日:2019/01/21
  • 更新日:2019/01/21
  • 投稿者:n bit

ユーザに合わせて表示させる内容が大幅に変わる時、読み込むテンプレートも条件分岐させたいことありますよね。今回はスーパーユーザ、ログインユーザ、未ログインユーザの3パターンで条件分岐させて読み込むテンプレートを変更させる方法を解説します。

  • Python
  • Django

この記事は約 分で読めます。(文字)

ユーザが持つ権限レベルでフロントエンドに表示させる内容を変更

今回解説するようなスーパーユーザ、ログインユーザ、未ログインユーザだけに限らず、独自のmodelを利用して作成したユーザ権限レベルなどに合わせてフロントエンドで表示させる内容を変更したいケースはよくあります。

軽微な表示内容の変更であればテンプレート内で分岐させることで簡単に表示内容を変更できますが、レイアウトも含めて表示内容が大幅に変わるときはそもそも読み込むテンプレート自体を変更しないと逆に管理が大変になる場合がほとんどです。

そこで今回はユーザの持つ権限レベルに合わせて読み込むテンプレート自体を変更する方法を解説しましょう。

読み込むテンプレートを変更する方法

読み込むテンプレートを変更するにはView内で『get_template_names』を利用します。『get_template_names』はView内で『template_name』に記述したテンプレートのパスを取得している関数です。

『get_template_names』内に条件分岐を設けて条件結果ごとに違うテンプレートのパスを取得すればそれぞれのユーザ権限レベルに合わせたテンプレートを読み込むことができます。

では、早速『get_template_names』のサンプルコードを見てみましょう。サンプルコードを見れば動きはすぐに理解できると思います。

get_template_names サンプルコード

class HogeView(generic.TemplateView):


template_name = 'app/template.html'

def get_template_names(self):

if self.request.user.is_superuser:
template_name = 'app/template_superuser.html'
elif self.request.user.is_authenticated:
template_name = 'app/template_authenticated.html'
else:
template_name = self.template_name

return [template_name]

少しコードについて解説しておきましょう。

今回条件分岐させるアカウント権限レベルは下記の3つです。

  • スーパーユーザ
  • ログインユーザ
  • 未ログインユーザ

それぞれのView内での条件式は以下のようになります。

スーパーユーザ

if self.request.user.is_superuser:

ログインユーザ

elif self.request.user.is_authenticated:

未ログインユーザ

else:

上記コードの記述方法はスーパーユーザとログインユーザ以外にはアカウントユーザがない想定で記述されています。そのため『else』の中には未ログインユーザが到達するようになります。

  • その他にもユーザアカウントレベルがある場合は適宜分岐コードを変更してください。

後はそれぞれの条件判定の後に各ユーザ用のテンプレートパスを指定しています。

スーパーユーザ

template_name = 'app/template_superuser.html'

ログインユーザ

template_name = 'app/template_authenticated.html'

未ログインユーザ

template_name = self.template_name

未ログインユーザのテンプレートパスには標準で『template_name』に設定していたテンプレートパスをそのまま読み込ませました。

class HogeView(generic.TemplateView):


template_name = 'app/template.html'

予期しない表示に備えて『template_name』や『else』には1番アカウント権限レベルが低いテンプレートパスを指定しておくのが良いでしょう。

最後の行で条件分岐後に読み込んだテンプレートパスをreturnで返してください。

return [template_name]

returnで返されたテンプレートが読み込まれてフロントエンドに表示されます。これでアカウント権限レベルによるフロントエンドの表示コントロールは自由自在ですね。

今日のdot

今回利用した様なView内でのアカウント権限レベルに合わせた条件分岐はウェブアプリケーションの開発場面で数多く利用します。

if self.request.user.is_superuser:

pass
elif self.request.user.is_authenticated:
pass
else:
pass

今回のようなテンプレートの読み込みに利用した分岐方法は『get_template_names』以外でも利用することが可能です。

いろいろと便利な利用方法がありますので違う記事でもまた紹介していきます。