반응형
오늘은 장고의 클래스형 뷰를 사용해볼 것입니다!
Django에서는 개발자들이 자주 쓰는 뷰를 클래스로 제공하는데, 이를 이용하면 django에서 제공하는 여러 뷰를 알맞게 상속받아 대부분의 로직을 완성할 수 있습니다!
함수형 뷰는 모든 로직을 직접 구현하기 때문에 좀 더 직관적이라는 장점이 있지만 클래스형 뷰에 익숙해진다면 훨씬 더 쉽고 빠르게 필요한 기능을 구현할 수 있습니다.
함수형 뷰를 클래스형 뷰로 바꿔보기!
def page_create(request):
if request.method == 'POST':
page_form = PageForm(request.POST)
if page_form.is_valid():
new_page = page_form.save()
return redirect('page-detail', page_id=new_page.id)
else:
page_form = PageForm()
return render(request, 'diary/page_create.html', {'form': page_form})
위와 같은 코드로 작성된 create 함수형 뷰를 살짝 설명하자면
- 처음에 들어온 요청이 'POST' 요청인지 'GET' 요청인지 if 문을 통해 확인하기
- 'POST' 요청이라면 form에 들어온 요청 값을 넣은 후 유효성 검증을 실시한다!
- 만약 유효성 검증에 실패했을 경우 현재 들어온 값들을 유지한 채 다시 입력 페이지로 이동시킨다.
- 유효성 검증을 통과한다면 데이터베이스에 값을 저장한 후, 세부내역을 보여주는 'page-detail'로 이동한다.
- 'POST' 요청이라면 form에 들어온 요청 값을 넣은 후 유효성 검증을 실시한다!
- 'GET' 요청이라면 입력을 위한 빈 form을 만들어준다.
위와 같은 동작 방식으로 작동하는 함수형 뷰를 클래스형 뷰로 만든다면 아래의 코드로 변한다!
# views.py
from django.views import View
class PostCreateView(View):
def get(self, request):
page_form = PageForm()
return render(request, 'diary/page_create.html', {'form': page_form})
def post(self, request):
page_form = PageForm(request.POST)
if page_form.is_valid():
new_page = page_form.save()
return redirect('page-detail', page_id=new_page.id)
return render(request, 'diary/page_create.html', {'form': page_form})
하지만 클래스형 뷰를 쓸 때 주의해야 할 점은 url에서 함수형 뷰처럼 그냥 함수 이름만 적는 것이 아닌 뒤에 추가를 해줘야 합니다.
# urls.py
urlpatterns = [
path('diary/write/', views.PostCreateView.as_view(), name='page-create'),
]
위의 코드처럼 뒤에 as_view()를 따로 추가해줘야 합니다 :)
위처럼 함수형 뷰를 썼을 때 보다 더 깔끔하고 보기 좋게 코드를 작성할 수 있었는데요.
클래스형 뷰의 진짜 좋은 점은 구현할 로직에 맞는 여러 기능을 상속받을 때 발휘됩니다!
그 내용은 다음 글에 적도록 하겠습니다!
반응형
'Study > Django' 카테고리의 다른 글
[Django] Django 클래스형 뷰 ( Generic View- ListView) # 3 (0) | 2021.12.14 |
---|---|
[Django] Django 클래스형 뷰 ( Generic View - CreateView) # 2 (0) | 2021.12.14 |
[Django] django.core.exceptions.ImproperlyConfigured Error (0) | 2021.12.12 |
Django NoReverseMatch at Error (0) | 2021.12.12 |
Django Model Queryset API / 장고 모델 쿼리셋 API (0) | 2021.12.12 |