Index ソフト・ハード Djangoタスク | ClassViewサンプル |
クラスベース project01 accounts api base search thread |
クラスベース ()
from django.views.generic import View
from django.shortcuts import render
class CBView(View):
def get(self,request):
params = {"message":"クラスベースView:Get処理"}
return render(request,"Index.html",params)
def post(self,request):
params = {"message":"クラスベースView:Post処理"}
return render(request,"Index.html",params)
project01 accounts
from django.shortcuts import render, redirect
from django.views.generic import TemplateView, FormView, UpdateView
# from django.contrib.auth.forms import UserCreationForm
# from django.contrib.auth.models import User
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.views import (
LoginView, LogoutView, PasswordChangeView, PasswordChangeDoneView,
PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView,
PasswordResetCompleteView
)
from django.urls import reverse_lazy
from django.contrib.auth import login, authenticate
from .models import User
from .forms import (
UserInfoChangeForm,
CustomAuthenticationForm, CustomPasswordChangeForm,
CustomPasswordResetForm, CustomSetPasswordForm,
CustomUserChangeForm, CustomUserCreationForm, EmailChangeForm
EmailAuthenticationForm
)
class UserCreateView(FormView):
# form_class = UserCreationForm
form_class = CustomUserCreationForm
template_name = 'registration/create.html'
success_url = reverse_lazy('accounts:profile')
def form_valid(self, form):
print(self.request.POST['next'])
if self.request.POST['next'] == 'back':
return render(self.request, 'registration/create.html', {'form': form})
elif self.request.POST['next'] == 'confirm':
return render(self.request, 'registration/create_confirm.html', {'form': form})
elif self.request.POST['next'] == 'regist':
form.save()
# 認証
user = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'],
)
# ログイン
login(self.request, user)
return super().form_valid(form)
else:
# NGの場合
return redirect(reverse_lazy('base:top'))
class UserProfileView(LoginRequiredMixin, TemplateView):
template_name = 'registration/profile.html'
def get_queryset(self):
return User.objects.get(id=self.request.user.id)
class EmailChangeView(LoginRequiredMixin, FormView):
template_name = 'registration/change.html'
form_class = EmailChangeForm
success_url = reverse_lazy('accounts:profile')
def form_valid(self, form):
#formのupdateメソッドにログインユーザーを渡して更新
form.update(user=self.request.user)
return super().form_valid(form)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
# 更新前のユーザー情報をkwargsとして渡す。
kwargs.update({
'email' : self.request.user.email,
})
return kwargs
class UserChangeView(LoginRequiredMixin, FormView):
'''
Django組込みのUserを利用する場合のユーザー情報変更ビュー
カスタムユーザーでは使用しない。
'''
template_name = 'registration/change.html'
form_class = UserInfoChangeForm
success_url = reverse_lazy('accounts:profile')
def form_valid(self, form):
#formのupdateメソッドにログインユーザーを渡して更新
form.update(user=self.request.user)
return super().form_valid(form)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
# 更新前のユーザー情報をkwargsとして渡す。
kwargs.update({
'email' : self.request.user.email,
'first_name' : self.request.user.first_name,
'last_name' : self.request.user.last_name,
})
return kwargs
class CustomLoginView(LoginView):
form_class = EmailAuthenticationForm
class CustomLogoutView(LogoutView):
template_name = 'registration/logged_out.html'
next_page = '/project01/'
class CustomPasswordChangeView(PasswordChangeView):
form_class = CustomPasswordChangeForm
template_name = 'registration/password_change_form.html'
success_url = reverse_lazy('accounts:password_change_done')
class CustomPasswordChangeDoneView(PasswordChangeDoneView):
template_name = 'registration/password_change_done.html'
class CustomPasswordResetView(PasswordResetView):
email_template_name = 'registration/password_reset_email.html'
form_class = CustomPasswordResetForm
from_email = '[email protected]'
subject_template_name = 'registration/password_reset_subject.txt'
success_url = reverse_lazy('accounts:password_reset_done')
template_name = 'registration/password_reset_form.html'
class CustomPasswordResetDoneView(PasswordResetDoneView):
template_name = 'registration/password_reset_done.html'
class CustomPasswordResetConfirmView(PasswordResetConfirmView):
form_class = CustomSetPasswordForm
post_reset_login = False
post_reset_login_backend = None
success_url = reverse_lazy('accounts:password_reset_complete')
template_name = 'registration/password_reset_confirm.html'
class CustomPasswordResetCompleteView(PasswordResetCompleteView):
template_name = 'registration/password_reset_complete.html'
api
from django.views.generic import View
from django.http import JsonResponse
from thread.models import Vote
class CreateVoteView(View): # Viewを継承したクラスベースビュー
# いいね投票作成処理
def post(self, request, *args, **kwargs):
res = {
'result': False,
'message': '処理に失敗しました。'
}
# POST値に'comment_id'がなければBAD REQUESTとする
if not 'comment_id' in request.POST:
return JsonResponse(res, status=400) # JSON形式でレスポンスを返す。
# コメントIDとIPアドレスの取得
comment_id = request.POST['comment_id']
ip_address = get_client_ip(request)
# 既にIP登録があればコンフリクト
if Vote.objects.filter(comment_id=comment_id, ip_address=ip_address):
res['message'] = '投票済みです。'
return JsonResponse(res, status=409)
# Voteの保存に成功した場合のみ成功
if Vote.objects.create_vote(ip_address, comment_id):
res['result'] = True
res['message'] = 'ポイントを追加しました。'
return JsonResponse(res, status=201)
else:
return JsonResponse(res, status=500)
def get_client_ip(request):
# IPアドレスを取得
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
base
from django.views.generic import ListView, TemplateView
class TopicListView(ListView):
template_name = 'base/top.html'
queryset = Topic.objects.order_by('-created')
context_object_name = 'topic_list'
class TopView(TemplateView):
template_name = 'base/top.html'
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['title'] = 'myDjango'
return ctx
search
from django.shortcuts import render
from django.db.models import Q
from django.views.generic import ListView
from functools import reduce
from operator import and_
from thread.models import Topic
class SearchResultView(ListView):
template_name = 'search/result.html'
context_object_name = 'result_list'
def get_queryset(self):
if self.request.GET.get('q', ''):
params = self.parse_search_params(self.request.GET['q'])
query = reduce(
lambda x,y : x & y,
list(map(lambda z: Q(title__icontains=z) | Q(message__icontains=z), params))
)
# 下記でもOK
# query = reduce(and_, [Q(title__icontains=p) | Q(message__icontains=p) for p in params])
return Topic.objects.filter(query)
else:
return None
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['query'] = self.request.GET.get('q', '')
return ctx
def parse_search_params(self, words: str):
search_words = words.replace(' ', ' ').split()
return search_words
thread
from django.shortcuts import render, redirect
from django.views.generic import CreateView, DetailView, TemplateView, ListView, FormView
from django.urls import reverse_lazy
from django.db.models import Count
from . forms import TopicModelForm, TopicCreateForm, CommentModelForm
from . models import Topic, Comment
class CategoryView(ListView):
template_name = 'thread/category.html'
context_object_name = 'topic_list'
paginate_by = 1 # 1ページに表示するオブジェクト数
page_kwarg = 'p' # GETでページ数を受けるパラメータ名、指定なしでは「page」
def get_queryset(self):
return Topic.objects.filter(category__url_code = self.kwargs['url_code'])
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['category'] = get_object_or_404(Category, url_code=self.kwargs['url_code'])
return ctx
class TopicAndCommentView(FormView):
template_name = 'thread/detail_topic.html'
form_class = LoginedUserCommentModelForm
def get_form_class(self):
# ログイン状態によってフォームを動的に変更する
if self.request.user.is_authenticated:
return LoginedUserCommentModelForm
else:
return CommentModelForm
def form_valid(self, form):
kwargs = {}
if self.request.user.is_authenticated:
kwargs['user'] = self.request.user
form.save_with_topic(self.kwargs.get('pk'), **kwargs)
response = super().form_valid(form)
return response
def get_success_url(self):
return reverse_lazy('thread:topic', kwargs={'pk': self.kwargs['pk']})
def get_context_data(self):
ctx = super().get_context_data()
ctx['topic'] = Topic.objects.get(id=self.kwargs['pk'])
ctx['comment_list'] = Comment.objects.filter(
topic_id=self.kwargs['pk']).annotate(vote_count=Count('vote')).order_by('no')
return ctx
class TopicCreateView(CreateView):
template_name = 'thread/create_topic.html'
form_class = LoginedUserTopicModelForm
model = Topic
success_url = reverse_lazy('base:top')
def get_form_class(self):
# ログイン状態によってフォームを動的に変更する
if self.request.user.is_authenticated:
return LoginedUserTopicModelForm
else:
return TopicModelForm
def form_valid(self, form):
ctx = {'form': form}
if self.request.POST.get('next', '') == 'confirm':
ctx['category'] = form.cleaned_data['category']
return render(self.request, 'thread/confirm_topic.html', ctx)
if self.request.POST.get('next', '') == 'back':
return render(self.request, 'thread/create_topic.html', ctx)
if self.request.POST.get('next', '') == 'create':
form.save(self.request.user)
# メール送信処理
template = get_template('thread/mail/topic_mail.html')
user_name = self.request.user.username if self.request.user else form.cleaned_data['user_name']
mail_ctx={
'title': form.cleaned_data['title'],
'user_name': user_name,
'message': form.cleaned_data['message'],
}
EmailMessage(
subject='トピック作成: ' + form.cleaned_data['title'],
body=template.render(mail_ctx),
from_email='[email protected]',
to=['[email protected]'],
#cc=['[email protected]'],
#bcc=['[email protected]'],
).send()
#return super().form_valid(form)
return redirect(self.success_url)
else: # NGの場合
return redirect(reverse_lazy('base:top'))
|
All Rights Reserved. Copyright (C) ITCL |