[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
view
part of the view – the method that accepts arequest
argument 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
GET
will be delegated toget()
, aPOST
topost()
, and so on.By default, a
https://docs.djangoproject.com/en/4.0/ref/class-based-views/base/#django.views.generic.base.View.dispatchHEAD
request will be delegated toget()
. If you need to handleHEAD
requests 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
에러를 발생시킵니다.