Web 공부/Django

클래스형 뷰

sumiin 2022. 4. 1. 01:38
반응형
SMALL

클래스(class) - 변수와 함수의 집합

 

클래스형 뷰(Classed based view)

- 개발자들이 자주 쓸만한 view를 클래스로 만들어 둔 것

- django는 CRUD 각각의 클래스형 뷰 제공 !

 

def post_create(request):
    if request.method=='POST':
        post_form=PostForm(request.POST)
        if post_form.is_valid():    
            new_post=post_form.save()
            return redirect('post-detail',post_id=new_post.id)
    else: #GET
        post_form=PostForm()
    return render(request,'posts/post_form.html',{'form':post_form})

기존 함수형 뷰

                                          ↓

 

from django.views import View

class PostCreateView(View):
    def get(self,request):
        post_form=PostForm()
        return render(request,'posts/post_form.html',{'form':post_form})
    
    def post(self,request):
        post_form=PostForm(request.POST)
        if post_form.is_valid():    
            new_post=post_form.save()
            return redirect('post-detail',post_id=new_post.id)
        return render(request,'posts/post_form.html',{'form':post_form})

클래스형 뷰!

post와 get방식을 함수로 구분해줌 

 

path('posts/new',views.PostCreateView.as_view(),name='post-create'),

urls.py에서 path도 변경 ,

클래스형 뷰는 클래스 이름 뒤에 as_view()를 붙여줘야 함

 

                                      

 

class PostCreateView(CreateView):
    model=Post
    form_class=PostForm 
 
    def get_success_url(self):
        return reverse('post-detail',kwargs={'pk':self.object.id})
  template_name='posts/post_form.html' #createView에서 기본 template_name은 <모델명>_form.htmld이므로 생략 가능
 

 

제네릭 뷰(Generic view)

 

제네릭 뷰(Generic view)

- 개발자들이 자주 쓸만한 view를 하나의 형태로 만들어 둔 것 

- 제네릭 뷰를 상속하면 원하는 기능을 빠르게 짜임새 있는 구조로 제작 가능 

- CRUD 각각에 해당하는 generic view가 장고에 구현되어 있음

 

from django.views.generic import CreateView
from django.urls import reverse

class PostCreateView(CreateView):
    model=Post
    form_class=PostForm
    template_name='posts/post_form.html'

    def get_success_url(self):
        return reverse('post-detail',kwargs={'post_id':self.object.id})

model과 modelform과 render할 template을 변수에 넣어줌 

글 작성이 다 됐을 떄, 이동할 곳을 get_success_url에 적어줌 

(kwargs 안에 post_id를 기재해주면 됨 )

 

 

def post_list(request):
    posts=Post.objects.all()
    paginator=Paginator(posts,6)
    curr_page_number=request.GET.get('page')
    if curr_page_number is None:
        curr_page_number=1
    page=paginator.page(curr_page_number)
    return render(request,'posts/post_list.html',{'page':page})

기존 함수형 뷰 post_list

                                      ↓ 

from django.views.generic import ListView

class PostListView(ListView):
    model=Post
    template_name='posts/post_list.html'
    context_object_name='posts' #넘겨줄 데이터의 이름, object_list대신 쓸 변수명 정함 
    ordering=['-dt_created'] #정렬 최신순(-안붙일 경우 오래된 순)
    paginate_by=6
    page_kwarg='page'

context_object_name에 데이터를 넘겨줌 

view에서 template으로 전달되는 모델 데이터 이름을 정해주는 것 

즉, PostListView를통해 얻은 PostList들을 posts에 담음 

 

                                      ↓ 

 

class PostListView(ListView):
    model=Post
    ordering=['-dt_created'] #정렬 최신순(-안붙일 경우 오래된 순)
    paginate_by=6

template_name='posts/post_list.html' #<모델명>_list가 기본 template name이기때문에 생략 가능

context_object_name='posts' #기본적으로 listView는 object_list와 <모델명>_list로 전달 context_object_name을 쓰면 이를 대체하는 것

page_kwarg='page' #page_kwarg의 기본값은 page임 생략가능

 => 3줄로 생략 가능!!

 

Detail

 

from django.views.generic import DetailView

class PostDetailView(DetailView):
    model=Post
    template_name='posts/post_detail.html'
    pk_url_kwarg='post_id'
    context_object_name='post'

PostDetail에서는 post_id가 필요하기 떄문에 pk_url_kwarg에 넘겨줌

 

                                      

    

class PostDetailView(DetailView):
    model=Post
pk_url_kwarg='post_id' #pk_url_kwarg의 기본값은 pk임 urls.py에서 인자를 넘겨줄때 pk로 하면 생략 가능
 
context_object_name='post' #하나의 데이터를 context로 넘겨줄때 object라는 키워드나 모델명을 통해 넘겨줌 모델명 post이기 떄문에 생략 가능

 

Update

from django.views.generic import UpdateView

class PostUpdateView(UpdateView):
    model=Post
    form_class=PostForm
    template_name='posts/post_form.html'
    pk_url_kwarg='post_id'

    def get_success_url(self) :
        return reverse('post-detail',kwargs={'post_id':self.object.id})

                                      

 

class PostUpdateView(UpdateView):
    model=Post
    form_class=PostForm
 
    def get_success_url(self) :
        return reverse('post-detail',kwargs={'pk':self.object.id})
    template_name='posts/post_form.html' #UpdateView또한 template_name이 <모델명>_form.html이므로 생략가능
    pk_url_kwarg='post_id' #pk_url_kwarg의 기본 갑인 pk로 바꿔주고 생략가능

 

 

Delete

class PostDeleteView(DeleteView):
    model=Post
    template_name='posts/post_confirm_delete.html'
    pk_url_kwarg='post_id'
    context_object_name='post'
    
    def get_success_url(self):
        return reverse('post-list')

post_id가 필요하므로 pk_url_kwarg에 담아줌 

 

                                      

class PostDeleteView(DeleteView):
    model=Post

    def get_success_url(self):
        return reverse('post-list')
   template_name='posts/post_confirm_delete.html'#Deleteview의 template_name 기본값은 <모델명>_confirm_delete.html이므로 생략가능
    pk_url_kwarg='post_id' #기본값인 pk로 urls.py에서 바꿔주고 생략가능
    context_object_name='post' #위와 같은 이유로 생략가능
 

Redirect

class IndexRedirectView(RedirectView):
    pattern_name='post-list'

 

 

반응형
LIST

'Web 공부 > Django' 카테고리의 다른 글

Django에서 npm package(toast ui) 사용하기  (0) 2022.04.05
다양한 상황 대처  (0) 2022.03.30
Form에 CSS 적용  (0) 2022.03.29
유효성 검사 (Validation)  (0) 2022.03.29
폼(Form)  (0) 2022.03.29