클래스(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})
제네릭 뷰(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
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})
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')
Redirect
class IndexRedirectView(RedirectView):
pattern_name='post-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 |