本記事について
UdemyでDjangoについて学習した結果のアウトプットページです。
前の記事はこちらです。
今回は、前回作成した日記アプリケーションにログイン機能を実装します。
成果物
ログイン前のTOPページ(ナビバーに一覧とログインが表示されています。)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F242659%2F5c43af6f-a9a5-4f84-88c2-ccd3015cf379.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4801f013da6a33a35083f54aadbfeb33)
ログイン後のTOPページ(ナビバーに一覧と追加とログアウトが表示されています。)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F242659%2Fd4dfcbed-9952-a880-b3d2-c588d412c1db.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3155c1849b328828e9ed2e75793758b1)
ログイン画面
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F242659%2F87cfd455-0d0e-1500-b02c-dd1b1be845bd.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=073c221abb1b47d4d420e140b028ef71)
ログアウト画面
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F242659%2Ff3cee9b6-3090-d1fb-497d-e7878b8dd2ce.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3a5e6f33372670620da4533c5c4bc19c)
settings.py
settings.pyにLOGIN_URLを追記します。
今回はadminサイトのログイン画面を流用するので、admin:loginとしましょう。
以下のコードをsettings.pyに追記します。
LOGIN_URL = 'admin:login'
views.py
今回は、追加・更新・削除のページにはログインが必要になるよう制御をかけたいと思います。
まずviews.pyを編集します。
LoginRequiredMixin
をimportしてください。
そしてログイン対象としたいクラスに、LoginRequiredMixin
を継承してください。
たったこれだけでログイン機能の実装は完了です。あとはHTMLの編集です。
※LoginRequiredMixin
はListViewなどのクラスよりも前に宣言してください。エラーになります。
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render, redirect, get_object_or_404
from .forms import DayCreateForm
from .models import Day
from django.views import generic
from django.urls import reverse_lazy
class IndexView(generic.ListView):
model = Day
paginate_by = 3
class DayCreateView(LoginRequiredMixin, generic.CreateView):
model = Day
form_class = DayCreateForm
success_url = reverse_lazy('diary:index')
class DayUpdateView(LoginRequiredMixin, generic.UpdateView):
# CreateViewとほぼ同じ内容だが、formだけでなくDayオブジェクトも渡している。
model = Day
form_class = DayCreateForm
success_url = reverse_lazy('diary:index')
class DayDeleteView(LoginRequiredMixin, generic.DeleteView):
model = Day
success_url = reverse_lazy('diary:index')
class DayDetailView(generic.DetailView):
model = Day
base.htmlの編集
次はHTMLの編集です。
ログイン後にだけ見せたいものがある場合は、以下のif文で囲うと実現できます。
{% if user.is_superuser %}ログイン後に見せたいもの{% endif %}
※else文には、ログイン前に見せたいものを表示させます。
下記のように記述すると、追加とログアウトはログイン後に表示され、
ログインはログイン前に表示されます。
target="_blank"としておくと、ログイン・ログアウトが別タブで開きます。
<div class="container">
<nav class="nav">
<a class="nav-link active" href="{% url 'diary:index' %}">一覧</a>
{% if user.is_superuser %}
<a class="nav-link" href="{% url 'diary:add' %}">追加</a>
<a class="nav-link" href="{% url 'admin:logout' %}" target="_blank">ログアウト</a>
{% else %}
<a class="nav-link" href="{% url 'admin:login' %}" target="_blank">ログイン</a>
{% endif %}
</nav>
{% block content %}
{% endblock %}
</div>
動作確認
py manage.py runserverで動作確認してください。
更新・削除ボタンをクリックすると、ログイン画面に変移するかと思います。