本記事について
UdemyでDjangoについて学習した結果のアウトプットページです。
前の記事はこちらです。
今回は、前回作成した日記アプリケーションにログイン機能を実装します。
成果物
ログイン前のTOPページ(ナビバーに一覧とログインが表示されています。)
ログイン後のTOPページ(ナビバーに一覧と追加とログアウトが表示されています。)
ログイン画面
ログアウト画面
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で動作確認してください。
更新・削除ボタンをクリックすると、ログイン画面に変移するかと思います。