質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

968閲覧

[Django]セッションの有無で表示テンプレートを分岐させたい

Anakagawa

総合スコア1

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2022/09/02 10:11

前提

Djangoでログイン機能やフォーム機能はない、単純にクラスベースのテンプレート表示しているサイトを作成しています。
この場合、サイト(example.com)にアクセスした時に指定のセッションが付与されてない場合は、別テンプレートを表示させるよう分岐させたいと思っています。

実現したいこと

成人向けサイトによくある年齢確認ページのようなものをイメージしていて、
example.comにアクセスした時のセッションが切れるまで年齢確認ページをスキップできることを実現したいです。

この場合、どのような仕組みを利用すれば実現できるのでしょうか。

PHPのsession_start() を利用しようとしましたが、DjangoでPHPコードを利用することは避けたく思います。

該当のソースコード

トップページ用と年齢確認ページ用のTemplateViewを用意した場合を想定しています。

views.py(抜粋)

class topView(TemplateView): template_name = 'top.html' class checkView(TemplateView): template_name = 'check.html'

check.html(抜粋)

<div class="enter"><a href="/">18歳以上です</a></div> <div class="leave"><a href="http://www.google.co.jp/">18歳未満です</a></div>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

 Djangoにはセッションを操作できる機能があるので、これを使ってリダイレクトなどを行うとできると思います。

 やり方はたくさんあると思いますが今回は以下のようなクエリ・リダイレクトを利用したものにしておきます


check: topへの遷移時にクエリパラメータにフラグを付与する形にします。
top:アクセスしたときセッションの有無でリダイレクトするか処理。クエリにフラグがある場合はセッションを付与させ表示。


自分も最近始めた初心者なので拙いところあるかもしれませんがご了承下さい…

requestという変数でsessionが利用できるのでGET関数をオーバーライドしてsessionを追加します

python

1class topView(TemplateView): 2 template_name = "index.html" 3 4 def get(self, request, *args, **kwargs): 5 #クエリ"from_check=true"があればセッション付与 6 from_check = request.GET.get("from_check") 7 if from_check == "true": 8 request.session["hogehoge"] = "hoge" 9 10 #セッションがない人はcheckへリダイレクト 11 if not ("hogehoge" in request.session): 12 return redirect(checkの名前) 13 else: 14 return super().get(request, args, kwargs) 15 16class checkView(TemplateView): 17 template_name = 'check.html'

check.html

html

1 <div class="enter"><a href="/?from_check=true">18歳以上です</a></div> 2 <div class="leave"><a href="http://www.google.co.jp/">18歳未満です</a></div>

 check.htmlの最初のリンクに"from_check"というクエリをつけています。これがcheckページから来たというフラグになっているのでtopページで受け取ってセッションを付与しています。

 セッションは適当に"hogehoge"というセッション名に"hoge"というデータが入っています。適宜わかりやすいセッション名に書き換えたりしておいてください。中のデータは今のところ意味はないです。

 checkの名前というのはurlsに指定したcheckの名前空間です。最悪urlでもokです(おすすめではないですが…)。

最後に

 やり方はたくさんあり今回のは一例で自分がこの場で考えた即席のものです。RedirectViewを使用したりクエリが邪魔だから別のタイミングにセッション付与するなどもあると思うので気になったら調べたりしてみてくださいね

 ちなみにセッションはデフォルトで二週間は維持されるようです。こちらも詳細はDjango公式とかで調べるとわかると思います

投稿2022/09/03 08:23

rykss

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Anakagawa

2022/09/03 15:08

ご丁寧な回答ありがとうございます! GET関数をオーバーライドしてsessionを追加という部分が思いつかず悩んでいましたが、 いただいたコードを参考にやりたいことが実現できました! 「クエリが邪魔だから別のタイミングにセッションを付与」も実現させてみたいので調べながら挑戦してみます。 ありがとうございました。
rykss

2022/09/04 03:39

解決出来たようで良かったです…! 説明にいろいろなことをつめすぎた感もあるので、疑問に思ったところを調べていくと今後のためにもいいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問