途中までパラパラ記事を見ながら進めていたが、Django2系とかと同じようにやっても上手く行かなかったので、公式のドキュメントを読みながら進めたいと思います。
### forms.py
まず、forms.pyから最初に作ります。AuthenticationFormをimportします。
forms.py
from django.contrib.auth.forms import AuthenticationForm class LoginForm(AuthenticationForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' field.widget.attrs['placeholder'] = field.label
### urls.py
ログイン画面用のパス(login/)とログイン認証処理用(login_auth/)、ログイン後にリダイレクトするパス(/)を用意します。
urls.py
urlpatterns = [
// 省略
path('login/', views.login_form, name='login_form'),
path('login_auth/', views.login_auth, name='login_auth'),
path('', views.top, name='top'),
// 省略
]
### views.py
– login画面は、forms.pyで作成したLoginFormを読み込みます。
– ログイン認証処理では、postされたusernameとpasswordからauthenticateして、userが存在すればトップページにリダイレクトさせます。
views.py
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
from .forms import LoginForm
def login_form(request):
params = {
'form': LoginForm(),
}
return render(request, 'myapp/login.html', params)
def login_auth(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')
else:
params = {
'form': LoginForm(request.POST),
}
return render(request, 'myapp/login.html', params)
@login_required(login_url='/login/')
def top(request):
return render(request, 'myapp/top.html')
### template
テストの為、テンプレートは適当に作ってます。※エラーメッセージのところが上手くいってないので、views.py, forms.pyと合わせて修正する必要がある。
<form action="/login_auth/" method="POST">
{% csrf_token %}
{{ form.non_field_errors }}
{% for field in form %}
{{ field}}
{{ field.errors }}
{% endfor %}
<button type="submit" class="btn btn-success btn-lg btn-block">ログイン</button>
</form>
ログイン前

ログイン後
-> topページにリダイレクトしました。

続いて、ログアウト処理を作っていきます。