2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python初心者によるDjango超入門!その6 ログイン機能を実装してみた

Last updated at Posted at 2020-08-19

本記事について

UdemyでDjangoについて学習した結果のアウトプットページです。
前の記事はこちらです。

今回は、前回作成した日記アプリケーションにログイン機能を実装します。

成果物

ログイン前のTOPページ(ナビバーに一覧とログインが表示されています。)

ログイン後のTOPページ(ナビバーに一覧と追加とログアウトが表示されています。)

ログイン画面

ログアウト画面

settings.py

settings.pyにLOGIN_URLを追記します。
今回はadminサイトのログイン画面を流用するので、admin:loginとしましょう。
以下のコードをsettings.pyに追記します。

settings.py
LOGIN_URL = 'admin:login'

views.py

今回は、追加・更新・削除のページにはログインが必要になるよう制御をかけたいと思います。

まずviews.pyを編集します。
LoginRequiredMixinをimportしてください。
そしてログイン対象としたいクラスに、LoginRequiredMixinを継承してください。
たったこれだけでログイン機能の実装は完了です。あとはHTMLの編集です。
LoginRequiredMixinはListViewなどのクラスよりも前に宣言してください。エラーになります。

views.py
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"としておくと、ログイン・ログアウトが別タブで開きます。

base.html
    <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で動作確認してください。
更新・削除ボタンをクリックすると、ログイン画面に変移するかと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?