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>
ディスカッション
コメント一覧
まだ、コメントがありません