LoginView LogoutViewを継承してログインログアウト機能を作って見る

LoginView LogoutViewを継承してログインログアウト機能を作って見る

以前の記事ではviewに何も書かず継承せずに使用していたので今回は継承させてたものを書き残しておきたいと思います。完全に自分用のメモですが...

参考:
  ・Djangoでログイン画面を作成する
  ・Djangoでログイン機能を作る

階層

階層は下の通りです。
templatesはプロジェクト直下に配置するようにしています。


.
├── config
│   ├── settings.py
│   └── urls.py
├── manage.py
├── myapp
│   ├── forms.py
│   ├── urls.py
│   └── views.py
├── static
└── templates
    └── myapp
        ├── index.html
        └── login.html

プログラム

ルーティングは下の通りです。


# config/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),
]

# myapp/urls.py
from django.urls import path
from . import views

app_name = 'myapp'
urlpatterns = [
    path('login/', views.Login.as_view(), name='login'),
    path('logout/', views.Logout.as_view(), name='logout'),
    path('index/', views.index, name='index'),
]

フォームは下の通りです。


# myapp/forms.py
from django.contrib.auth import forms as auth_forms

class LoginForm(auth_forms.AuthenticationForm):
    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)
        for field in self.fields.values():
            field.widget.attrs['placeholder'] = field.label

ビューは下の通りです。


# myapp/views.py
from django.shortcuts import render
from django.contrib.auth.views import LoginView, LogoutView
from . import forms

class Login(LoginView):
    form_class = forms.LoginForm
    template_name = "myapp/login.html"

class Logout(LogoutView):
    template_name = "myapp/index.html"

def index(reqest):
    return render(reqest, 'myapp/index.html')

セッティングは下の通りです。


# config/settings.py
LOGIN_URL = 'myapp:login'
LOGIN_REDIRECT_URL = 'myapp:index'
LOGOUT_REDIRECT_URL = 'myapp:index'

テンプレートは下の通りです。


<!--templates/myapp/index.html-->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>index</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <p>TopPage</p>
    <a href="{% url 'myapp:logout' %}">Logout</a>
</body>
</html>

<!--templates/myapp/login.html-->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Login</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <form action="" method="POST">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Login</button>
    </form>
</body>
</html>