SoShin_
소신
SoShin_
전체 방문자
오늘
어제
  • 분류 전체보기
    • Study
      • HTML | CSS
      • JavaScript
      • Django
      • Python
      • Flask
      • Git
      • Project
      • 이것저것
      • 코딩테스트
      • NestJS
    • Review
      • Book
      • Movie & Drama

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • openpyxl
  • 장고 유저기능
  • 코딩테스트
  • 위도경도
  • FLASK
  • Django
  • 장고 allauth
  • flask orm
  • 장고
  • Python
  • JavaScript
  • SQLite
  • 영화리뷰
  • orm
  • node.js
  • KakaoAPI
  • 영화추천
  • 유저기능
  • 문제풀이
  • js
  • Django allauth
  • SQLAlchemy
  • Django 유효성 검증
  • 자바스크립트
  • 플라스크
  • MongoDB
  • 장고 제네릭뷰
  • db
  • allauth
  • 파이썬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
SoShin_

소신

Study/Django

[Django] Django 클래스형 뷰 ( Class-Based Views ) # 1

2021. 12. 14. 11:48
반응형

오늘은 장고의 클래스형 뷰를 사용해볼 것입니다!

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 함수형 뷰를 살짝 설명하자면

  1. 처음에 들어온 요청이 'POST' 요청인지 'GET' 요청인지 if 문을 통해 확인하기
    1. 'POST' 요청이라면 form에 들어온 요청 값을 넣은 후 유효성 검증을 실시한다!
      • 만약 유효성 검증에 실패했을 경우 현재 들어온 값들을 유지한 채 다시 입력 페이지로 이동시킨다.
    2. 유효성 검증을 통과한다면 데이터베이스에 값을 저장한 후, 세부내역을 보여주는 'page-detail'로 이동한다.
  2. '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
    'Study/Django' 카테고리의 다른 글
    • [Django] Django 클래스형 뷰 ( Generic View- ListView) # 3
    • [Django] Django 클래스형 뷰 ( Generic View - CreateView) # 2
    • [Django] django.core.exceptions.ImproperlyConfigured Error
    • Django NoReverseMatch at Error
    SoShin_
    SoShin_
    직접 쓰는 개발 블로그

    티스토리툴바