[REAL Python – Django] – “Django – Post 작성 통합 구현하기(1)”

[REAL Python – Django] – “Django – Post 작성 통합 구현하기(1)”

5월 21, 2022

요구 사항 정리

요구사항은 위와 같습니다. 이번 게시물에서는, 1번과 2번 을 다룰 것입니다.

스태프 이상의 권한을 가진 사람 글쓰기 가능하도록 하기, 저자 자동으로 추가하기

이전에 작성했던 글의 약간 업그레이드 버전입니다. 조금 더 이해한 내용을 바탕으로 정리하는 중!

class PostCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
    template_name = 'blog/post_form.html'
    success_url = '/blog/'
    form_class = PostForm


    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff

    def form_valid(self, form):
        current_user = self.request.user

        # 현재 사용자가 로그인하였고, 스태프 권한이나 최고 관리자 권한을 가졌다면
        if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
            form.instance.author = current_user # 글쓴이 = 현재 유저 자동으로 등록되도록 하기
            response = super(PostCreateView, self).form_valid(form)
            return response

        else:
            return redirect('/blog/')

위의 코드를 작성함으로서 해결할 수 있습니다.

이전의 포스트에서도 그랬듯이 LoginRequiredMixin, UserPassesTestMixin 의 두 가지 믹스인이 들어간 것을 볼 수 있습니다. 먼저 test_func란 무엇인고 하니..

UserPassesTestMixin 의 원래 형태.

먼저 UserPassesTestMixin은 test_func()가 False를 반환한다면 권한 에러와 함께 요청을 거절한다는 설명이 보입니다. test_func를 오버라이딩해 줌으로서 권한이 있는지 혹은 없는지를 검증할 수 있게끔 하는 것이죠!

그렇기에, return self.request.user.is_superuser or self.request.user.is_staff 라는 코드로 현재 유저가 최고 관리자이거나, 스태프 권한을 가지고 있음을 True&False로 반환하는 코드를 작성한 것입니다. 실제로..

선언부를 찾아가 보면, is_superuser은 불리언 필드임을 확인할 수 있다!

마찬가지로 is_staff 또한 확인해 보면 불리언 필드입니다. 아무튼, 우리는 test_func 를 재정의함으로서 스태프 이상의 권한을 가지지 않은 사람은 권한 에러가 발생하게끔 처리하였습니다.

폼에서 글을 작성해 보면, 실제로 글 작성자가 잘 추가된 것을 알 수 있다!

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.