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

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

3월 19, 2022

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 a request 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 to get(), a POST to post(), and so on.

By default, a HEAD request will be delegated to get(). If you need to handle HEAD requests in a different way than GET, you can override the head() method. See Supporting other HTTP methods for an example.

https://docs.djangoproject.com/en/4.0/ref/class-based-views/base/#django.views.generic.base.View.dispatch

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 에러를 발생시킵니다.

Leave A Comment

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.