15. CreatePost, UpdatePost

자무카·2023년 4월 9일
0

doit

목록 보기
4/5

PostCreate(,,CreateView):

1 글쓰기 뼈대

# from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import CreateView
# from django.utils.text import slugify
from .models import Category, Tag, Post

class PostCreate(CreateView):
  model = Post
  fields = ['title', 'content', 'category']
  
  def test_func(self):
  	return 검사
  
  def form_valid(self, form):
  	1-1. form.instance.author 에 로그인 정보 저장
    1-2. response = super().form_valid(form)
    
    2. tags_str = self.request.POST.get('tags_str')
    return response

2 권한 설정: test_func(self)

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import CreateView
# from django.utils.text import slugify
from .models import Category, Tag, Post

class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
  model = Post
  fields = ['title', 'content', 'category']

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

3 author는 로그인 정보로 입력

form의 request.POST를 받아서 처리하는 form_valid(self, form) 오버라이딩!
1. author는 포린키! form.instance.author : 폼의 author속성에 로그인 정보
2. 원래의 form_valid(form)객체에 (author를 추가한) form 을 담아서,
3. response 에 담아 리턴

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import CreateView
# from django.utils.text import slugify
from .models import Category, Tag, Post

class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
  model = Post
  fields = ['title', 'content', 'category']

  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(PostCreate, self).form_valid(form)
      
      return response
    else:
      return redirect('/blog/')

4. tag 는 Tag 모델에 입력 : slugify, get_or_create()

다대다 데이터 생성 (post, tag )

self.object.tags.add(tag)

폼에서 입력받은 태그 가져오기 : self.request.POST.get('tags_str')

  • 태그형태는 태그1,태그2;태그3
  1. 태그 저장할 때 , 또는 ; 로 저장했는데, split 해서 리스트에 담기 위해, , 를 ; 로 replace
  2. tags_str.split(';')으로 리스트에 담기.
  3. tag, is_tag_created = get_or_create(name=tag) : 값과 생성여부를 리턴
  4. 새로 생성된 경우면, slugify 로 tag.slug 값을 생성해서 넣어준다.
  5. 위에 생성된 post 객체에 tag 추가. N:N 에서 데이터 생성+관계
    self.object.tags.add(tag)

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import CreateView
from django.utils.text import slugify
from .models import Category, Tag, Post

class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
    model = Post
    fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']

    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(PostCreate, self).form_valid(form)

            tags_str = self.request.POST.get('tags_str')
            if tags_str:
                tags_str = tags_str.strip()

                tags_str = tags_str.replace(',', ';')
                tags_list = tags_str.split(';')

                for t in tags_list:
                    t = t.strip()
                    tag, is_tag_created = Tag.objects.get_or_create(name=t)
                    if is_tag_created:
                        tag.slug = slugify(t, allow_unicode=True)
                        tag.save()
                    # 새로 만든 포스트(self.object)의 tags 필드에 tag추가
                    self.object.tags.add(tag)

            return response

        else:
                return redirect('/blog/')

2 PostUpdate(_,UpdateView):

2-1 PostUpdate(UpdateView)

  1. template_name 별도로 지정한 이유는? 지정 안하면, 기존 create_form.html 중복
  2. author 를 폼에 넣을 때는 , request.user 였고, tag는 현재 post(self.object)의 tags 를 조회 후, context에 추가 -> 렌더링
  3. dispatch 기능은? http_method GET 이면 신규폼, POST면 수정 입력폼
  4. dispatch 오버라이딩 이유는? 글쓰기 입력 / 수정 폼을 보여주기 전에, 먼저 폼을 볼 수 있는 권한 검사 실행하기 위함
  5. form_valid : 글쓰기와 거의 동일
    • self.object.tags.clear() 후, 새로 입력.
class PostUpdate(LoginRequiredMixin, UpdateView):
    model = Post
    fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']
    # 기본은 접미사가 _form 인 것인데, 분리. 왜?
    template_name = 'blog/post_update_form.html'

    # 폼에 입력된 데이터 중, 태그는 별도로 불러와야 한다.
    def get_context_data(self, **kwargs):
     
    def dispatch(self, request, *args, **kwargs):
    # 태그 입력 위해
    def form_valid(self, form):
        response = super(PostUpdate, self).form_valid(form)
        # 현재 post(object) 에 입력된 tags는 모두 지우고, 폼에서 새로 받아서 입력.
        self.object.tags.clear()
        tags_str = self.request.POST.get('tags_str')
profile
가즈아

0개의 댓글