クラスベース
 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'))