[REAL Python – Django] – “Django – 포스트 Update 구현하기”
[REAL Python – Django] – “Django – 포스트 Update 구현하기”

urls.py 작성 -> views.py 작성 ->templates 작성, 이제는 익숙하다
모델을 수정하거나 추가할 필요가 없는 경우 대부분 위의 과정으로 새 페이지가 만들어졌습니다.
# urls.py에 새로운 url 패턴 작성
urlpatterns = [
path('update_post/<int:pk>/', views.PostUpdate.as_view()),
path('create_post/', views.PostCreate.as_view()),
path('tag/<str:slug>/', views.tag_page),
path('category/<str:slug>/', views.category_page),
path('', views.PostList.as_view()),
path('<int:pk>/', views.PostDetail.as_view())
]
UpdateView를 상속해 CBV 구현
class PostUpdate(LoginRequiredMixin, UpdateView):
model = Post
fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category', 'tags']
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and request.user == self.get_object().author:
return super(PostUpdate, self).dispatch(request, *args, **kwargs)
else:
raise PermissionDenied
장고에서 제공하는 UpdateView를 이용합니다.
함수 dispatch() 를 재정의하였는데, 이것은 미리 장고에서 제공해두는 메서드입니다.
dispatch(request, *args, **kwargs)¶The
viewpart of the view – the method that accepts arequestargument plus arguments, and returns an HTTP response.The default implementation will inspect the HTTP method and attempt to delegate to a method that matches the HTTP method; a
GETwill be delegated toget(), aPOSTtopost(), and so on.By default, a
https://docs.djangoproject.com/en/4.0/ref/class-based-views/base/#django.views.generic.base.View.dispatchHEADrequest will be delegated toget(). If you need to handleHEADrequests in a different way thanGET, you can override thehead()method. See Supporting other HTTP methods for an example.
dispatch() 는 클라이언트가 GET방식 혹은 POST방식으로 요청을 보내는지 확인하고, 그 클라이언트가 검증되었는지를 확인해 줍니다.
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and request.user == self.get_object().author:
return super(PostUpdate, self).dispatch(request, *args, **kwargs)
else:
raise PermissionDenied
그러면, 이 코드가 조금 더 쉽게 이해됩니다. 사용자가 로그인하였고(request.user.is_authenticated), 사용자가 포스트의 저자와 같다면(request.user == self.get_object().author), PostUpdate에 구현된 dispatch 가 원래 역할을 하도록 처리하도록 코드를 작성합니다. 그렇지 않다면(else:) PermissionDenied 에러를 발생시킵니다.
