파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.
Create, Update, Delete 뷰를 함수형 뷰에서 폼 처리하는 코드와 클래스형 뷰에서 폼 처리하는 코드를 비교 구현해본다.
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()
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()
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는 이전 포스팅 참고