[Django]ログイン・ログアウトを実装
前回([Django]サインアップ機能 - ゆーじぇいブログ)の続きです。
ログイン機能
メールアドレスとパスワードでログインできるようにします。
users/forms.pyを編集
class LoginForm(forms.Form): user_cache = None email = forms.EmailField( widget=forms.EmailInput(attrs={'placeholder': "メールアドレス"}), ) password = forms.CharField( widget=forms.PasswordInput(attrs={'placeholder': "パスワード"}), ) def clean(self): email = self.cleaned_data.get('email') password = self.cleaned_data.get('password') user = authenticate(email=email, password=password) if not user: raise forms.ValidationError("メールアドレスまたはパスワードが違います") else: self.user_cache = user return self.cleaned_data
users/views.pyを次に編集。
from django.contrib.auth import authenticate, login, logout from django.views.generic import CreateView, TemplateView from .forms import SignUpForm, LoginForm class LoginView(TemplateView): template_name = 'users/login.html' def get(self, *args, **kwargs): return render(self.request, self.template_name, {'form': LoginForm()}) def post(self, *args, **kwargs): form = LoginForm(self.request.POST) if form.is_valid(): login(self.request, form.user_cache) return redirect('users:index') return render(self.request, self.template_name, {'form': form})
users/urls.pyに記述。
urlpatterns = [ path('signup', views.SignUpView.as_view(), name='signup'), path('login', views.LoginView.as_view(), name='login'), ]
settings.pyも編集。
LOGIN_REDIRECT_URL = 'users:index' LOGIN_URL = 'login'
templates/users/login.htmlを作成。
{% block body %} <div> <form role="form" method="post" enctype="multipart/form-data"> {% csrf_token %} <h3>ログイン</h3> <div> <label for="id_email"><small>メールアドレス:</small></label> {{ form.email }} </div> <div> <label for="id_password"><small>パスワード:</small></label> {{ form.password }} </div> <button class="btn btn-success" type="submit">ログイン</button> </form> </div> <div> <h5>新規アカウント登録は<a href="{% url 'users:signup' %}">こちら</a>から</h5> </div> {% endblock %}
ログインできた後のページを作成しておく必要があるので、views.pyを編集。
from django.contrib.auth.mixins import LoginRequiredMixin class IndexView(LoginRequiredMixin, TemplateView): template_name = 'users/index.html' login_url = '/login'
users/urls.pyも編集。
urlpatterns = [ path('signup', views.SignUpView.as_view(), name='signup'), path('login', views.LoginView.as_view(), name='login'), path('', views.IndexView.as_view(), name='index'),
HTMLは簡単に。templates/users/index.html
{% block body %} <h1>ログインに成功しました</h1> {% endblock %}
ログアウト機能
次にログアウト機能を作成します。
users/views.pyに以下を記述。
class LogoutView(LoginRequiredMixin, TemplateView): def get(self, *args, **kwargs): logout(self.request) return redirect('users:login')
users/urls.pyを編集。
urlpatterns = [ path('signup', views.SignUpView.as_view(), name='signup'), path('login', views.LoginView.as_view(), name='login'), path('', views.IndexView.as_view(), name='index'), path('logout', views.LogoutView.as_view(), name='logout'), ]
ごちゃごちゃになってしまったが、なんとか動いた。次はユーザープロフィールページについて書こうと思います。
何かありましたら、以下に。
Twitterアカウント: じぇい👨💻 (@jyouj__) | Twitter
投げ銭も待ってまーす!-> jyouj__さんの投げ銭ビスケット募集中!