16. views.py¶
viewsは、api_viewsと同様に、forms, models, servicesを呼び出す方法を定義しているだけです。 GETの場合はクエリを取得してテンプレートを選択する。 POSTの場合はフォームを検証してエラーページを表示したり、 正しいフォームデータであればデータを保存したりビジネスロジックを呼び出したりします。
こちらも、煩雑になった場合はロジックをserviceやformsに移すように変更しましょう。
from django.shortcuts import render, redirect
from django.views.generic.base import View
from django.contrib.auth import logout
from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils import timezone
from lib import mixins
from . import models, forms, services
class LoginView(View):
template = 'users/login.html'
def get(self, request):
form = forms.LoginForm()
context = dict(form=form)
return render(request, self.template, context)
def post(self, request):
form = forms.LoginForm(request.POST, context={'request': request})
if not form.is_valid():
print(form.errors)
context = dict(errors=form.errors)
return render(request, self.template, context)
form.save()
service = services.UserLoginService()
# リダイレクト先を選択する
next_path = service.get_next_path(request)
return redirect(next_path)
class LogoutView(mixins.BaseMixin, View):
def get(self, request):
logout(request)
return redirect('top_view')
class UserDetailView(mixins.BaseMixin, View):
template = 'users/detail.html'
def get_queryset(self, user_id):
try:
reset_token = models.User.objects.get(user_id=user_id)
except models.User.DoesNotExist:
raise Http404
return user
def get(self, request, user_id):
user = self.get_queryset(user_id)
context = dict(user=user)
return render(request, self.template, context)