built-in CBV를 통한 처리 (함수형 뷰 와 비교)

guava·2021년 12월 20일
0
post-custom-banner

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.

Create, Update, Delete 뷰를 함수형 뷰에서 폼 처리하는 코드와 클래스형 뷰에서 폼 처리하는 코드를 비교 구현해본다.

Create

CreateView에서 템플릿명 디폴트는 {{model_name}}_form.html로 지정된다.


# 함수형 뷰에서 Create폼 처리하기
@login_required
def post_new(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()
            messages.success(request, '포스팅을 저장했습니다.')
            return redirect(post)
    else:
        form = PostForm()
    return render(request, 'instagram/post_form.html', {
        'form': form,
        'post': None
    })

# 클래스형 뷰에서 Create폼 처리하기
class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        messages.success(self.request, '포스팅을 저장했습니다.')
        return super().form_valid(form)


post_new = PostCreateView.as_view()

Update

UpdateView에서 템플릿명 디폴트는 {{model_name}}_form.html로 지정된다.

# 함수형 뷰에서 Update폼 처리하기
@login_required
def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)

    if post.user != request.user:
        messages.error(request, '작성자만 수정할 수 있습니다.')
        return redirect(post)

    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES, instance=post)
        if form.is_valid():
            post = form.save()
            messages.success(request, '포스팅을 저장했습니다.')
            return redirect(post)
    else:
        form = PostForm(instance=post)
    return render(request, 'instagram/post_form.html', {
        'form': form,
        'post': post
    })
    
# 클래스형 뷰에서 Update폼 처리하기
class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        messages.success(self.request, '포스팅을 저장했습니다.')
        return super(PostUpdateView, self).form_valid(form)


post_edit = PostUpdateView.as_view()

Delete

DeleteView에서 템플릿명 디폴트는 {{model_name}}_confirm_delete.html로 지정된다.

# 함수형 뷰에서 Delete 처리하기
@login_required
def post_delete(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == 'POST':
        post.delete()
        messages.success(request, '포스팅을 삭제했습니다.')
        return redirect('instagram:post_list')
    return render(request, 'instagram/post_confirm_delete.html', {
        'post': post,
    })

# 클래스형 뷰에서 Delete 처리하기
class PostDeleteView(LoginRequiredMixin, DeleteView):
    model = Post
    success_url = reverse_lazy('instagram:post_list')
    template_name = 'instagram/post_confirm_delete.html'

    def delete(self, request, *args, **kwargs):
        response = super(PostDeleteView, self).delete(request, *args, **kwargs)
        messages.success(request, '포스팅을 삭제했습니다.')
        return response

ListView 및 DetailView는 이전 포스팅 참고

post-custom-banner

0개의 댓글