ゆーじぇいブログ

ゆーじぇいブログ

プログラミングとか色々

[Django]ログイン・ログアウトを実装

f:id:jyouj:20181124164719j:plain

前回([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__さんの投げ銭ビスケット募集中!

[rakuten:rakutenkobo-ebooks:16092750:detail]