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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1334閲覧

ログイン前後で、同じURLだが異なる汎用クラスビューを表示したい。

alpaka

総合スコア170

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/05 02:31

実現したいこと
多くのWebサービスではログイン前後でURLが変わりませんがこれはDjangoではどのように実現すれば良いでしょうか。
例 http//:example.com(ログイン画面表示)→ログイン→http://example.com(コンテンツ一覧が表示)

今回の場合、ログイン前は
auth_views.LoginView(ログイン前:http://localhost:8000)→ログイン後→generic.ListView(ログイン後:http://localhost:8000)
にしてコンテンツ一覧を表示したいです。

参考
https://stackoverflow.com/questions/24289095/same-url-in-multiple-views-in-django
https://stackoverflow.com/questions/26571759/one-url-for-two-different-views/26571800
↑によると同じURLに異なるViewを割り当てることはできないようなので、ユーザが認証されたかどうかをifで判断して異なるテンプレートに分けるyうです。上記の回答は関数viewですが汎用ビューの場合にはどう実現すれば良いでしょうか。

urls.py

python

1from django.contrib.auth import views as auth_views 2urlpatterns = [ 3 path('', auth_views.LoginView.as_view(template_name='index.html'), name='index'),

ユーザがログイン後はこのviewを使いたい

from django.views.generic import ListView class UserIndexView(ListView): model = QuizInfo template_name = 'user_index.html'

汎用ビューを使わずとももしなにか他にベストプラクティスがありましたら、ご教授お願いします。

環境
Django2.1

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

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

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

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

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

t_obara

2018/12/05 08:24

ログイン処理について実装したことはありますか?ベストプラクティスを最初から求めるのではなく、実際に動かして試してみるのが一番だと思います。勉強するには。
guest

回答1

0

こちらで執筆されているもののうち、応用セクションのものが参考になると思われます。以下抜粋部です。

TemplateView 、というか ContextMixin の機能として、インスタンス化されたビュークラスを view という名前のテンプレート引数とするため、

python

1urls.py 2urlpatterns = [ 3 url(r'^myapp/a/$', TemplateView.as_view(template_name='myapp/index.html', mode='a'), 4 name='myapp-a'), 5 url(r'^myapp/b/$', TemplateView.as_view(template_name='myapp/index.html', mode='b'), 6 name='myapp-b'), ...

このような urls にしておき、テンプレートで

python:

1myapp/index.html 2{% if view.mode == 'a' %} 3 モードA表示 4{% elif view.mode == 'b' %} 5 モードB表示 6{% endif %}

このように表示を分岐させることもできます。

ここまでが抜粋部になります。

また、質問者さんがイメージされているところと完全に一致しているかはわかりませんが、多くのログインシステムを持つサイトでは、ログインをするとサイト上部にアカウント名やアカウントメニューが表示されます。この手の表示変更ならば、継承元となるhtmlファイルにnav要素として、以下のような記述で賄うことが可能です。

html

1<nav class="nav bg-light justify-content-end"> 2 <li class="nav-item justify-content-center"> 3 <a class="nav-link" href="{% url 'myapp:index' %}">トップページ</a> 4 </li> 5 {% if user.is_authenticated %} 6 <li class="nav-item"> 7 <a class="nav-link">こんにちは {{ user.get_username }} さん</a> 8 </li> 9 <li class="nav-item"> 10 <a class="nav-link" href="{% url 'accounts:logout' %}">ログアウト</a> 11 </li> 12 {% else %} 13 <li class="nav-item"> 14 <a class="nav-link">こんにちは ゲスト さん</a> 15 </li> 16 <li class="nav-item"> 17 <a class="nav-link" href="{% url 'accounts:login' %}">ログイン</a> 18 </li> 19 <li class="nav-item"> 20 <a class="nav-link" href="{% url 'accounts:create' %}">アカウント作成</a> 21 </li> 22 {% endif %} 23 {% block nav_item %}{% endblock %} 24</nav>

{% if user.is_authentificated %}でユーザーがログインしているかを判定して、ログインしていれば{{ user.get_username }}で名前を取得。ログインしていなければ{% else %}以下の表示が行われて、ログインを促す、といった形です。nav要素やli要素のクラスとして指定されているものはbootstrapを利用したサイト装飾のためのものとなりますので、不要であればもっとシンプルに書くことが可能です。

最後にログイン機能の実装についてですが、ネット上を探してみると、django-allauthやカスタムユーザーモデルを利用したものがよく紹介されています。外部のSNS等と連携したい場合は便利ですが、単なるサンプルサイトで既に初期マイグレーションを実行している場合は上手くいかないと思います。自分の場合は、こちらのサイトを参考にさせて頂いて実装しました。

……と、ここまで書いた上で2018年の質問であることに気づきました。おそらく質問者さんもチェックされていないと思われますが、せっかくなので投稿しておきます。同じような課題を抱えてこちらのサイトに辿り着かれた方の参考になれば幸いです。

投稿2021/02/26 17:00

kensoon

総合スコア48

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問