ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django 초간단 게시판 10. 권한 설정
    Python/초간단 장고 Django 2021. 5. 28. 21:54
    반응형

    일단 모델의 author 속성을 바꿔야 한다. 
    이렇게 되면 DB 내의 데이터들과 충돌을 일으키게 된다. 

    기존 데이터가 중요하다면
    새로운 게시판을 만들거나, 임의의 author를 설정하면 되겠지만, 
    지금 DB 내의 데이터들은 실습용 더미기 때문에 
    관리자 화면에서 깔끔하게 지워주자. 

    # board/models.py
    from django.contrib.auth.models import User
    from django.db import models
    
    
    class Article(models.Model):
        title = models.CharField(max_length=120, null=False)
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        content = models.TextField(null=False)
        created_at = models.DateTimeField(auto_now_add=True)
        modified_at = models.DateTimeField(auto_now=True)
        # default=timezone.now
    
        def __str__(self):
            return f'{self.title} / {self.author}'
    

    이렇게 설정을 하고 
    makemigrations, migrate를 해서
    DB에 변화를 반영하자. 

    ForeignKey라는 개념은 DB를 공부하지 않았다면 생소할 것이다. 

    시간이 없으니 넘어가자. 
    https://brunch.co.kr/@dan-kim/26
    하지만, 시간이 있다면 읽어도 좋다. 

     

    이렇게 해도 아무나 글을 지울 수 있다. ㄷㄷㄷㄷ.

     

    글을 지우거나 수정하는 것을 막기 위해서는
    각각의 뷰에 권한에 관련된 설정을 해야 한다. 

    일단 로그인 체크는 LoginRequiredMixin으로 가능하다. 
    from django.contrib.auth.mixins import LoginRequiredMixin

    믹스인으로 여러 클래스 뷰에서
    공통적으로 사용하는 기능을
    모아두면 유용하다.

    생각해 보면 CRUD(Create, read, update, delete) 중에서 
    본인 확인이 되어야 하는 것은 수정과, 지움.
    로그인이 필요한 것이 생성이다. 
    읽기는 일단 모든 사람에게 풀어두자. 

    본인확인을 위해서 
    AuthorRequiredMixin을 ...

     

    # board/views.py
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.http import HttpResponseForbidden
    from django.urls import reverse_lazy
    from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView
    
    from .models import Article
    
    
    class AuthorRequiredMixin(object):
        def dispatch(self, request, *args, **kwargs):
            """ Making sure that only authors can update, delete articles """
            obj = self.get_object()
            if obj.author != self.request.user:
                return HttpResponseForbidden()
            return super(AuthorRequiredMixin, self).dispatch(request, *args, **kwargs)
    
    
    class ArticleList(ListView):
        model = Article
        paginate_by = 5
        ordering = ['-id']
    
    
    class ArticleCreate(LoginRequiredMixin, CreateView):
        model = Article
        success_url = reverse_lazy('index')
        fields = ('title', 'content')
    
        def form_valid(self, form):
            form.instance.author = self.request.user
            return super().form_valid(form)
    
    
    class ArticleDetail(DetailView):
        model = Article
        # context_object_name = 'article'
    
    
    class ArticleUpdate(AuthorRequiredMixin, UpdateView):
        model = Article
        fields = ('title', 'content')
        success_url = reverse_lazy('index')
        
        def form_valid(self, form):
            form.instance.author = self.request.user
            return super().form_valid(form)
    
    
    class ArticleDelete(AuthorRequiredMixin, DeleteView):
        model = Article
        success_url = reverse_lazy('index')

     

    디자인은 다루지 않기로 했으므로.. 
    여기서 끝... 

    수고하셨습니다. ^^
    도움 되셨다면..
    숙제나 한번씩 쿨럭.. 

     

    반응형
Designed by Tistory.