2021.12.14 - [Study/Django] - [Django] 장고 유저 기능 구현하기 #1 (allauth와 contrib.auth의 차이)
[Django] 장고 유저 기능 구현하기 #1 (allauth와 contrib.auth의 차이)
Django에는 기본적으로 유저 기능을 구현하기 위한 Django.contrib.auth라는 패키지가 포함되어 있습니다. contrib은 contributed ( 기여하다 )의 약자이고 auth는 authentication( 유저 인증 )의 약자입니다. 직..
programmers-sosin.tistory.com
클래스를 사용하는 이유
: 클래스는 자주 사용하는 여러 가지 기능 등을 잘 정리된 하나의 구조로 만들어두고 그 구조를 재사용하여 빠른 개발을 하기 위해 사용한다.
Django에서는 위처럼 웹 서비스를 만들다가 자주 작성하게 되는 구조의 뷰를 하나의 형태로 만들어서 제공하는데 이러한 뷰를 '제네릭 뷰 [Generic View]'라고 합니다.
각각의 제네릭 뷰마다 자주 사용하는 기능이 미리 구현되어 있어서 제네릭 뷰를 상속한 다음 간단하게 몇 가지만 설정해 준면 우리가 원하는 기능을 짜임새 있는 구조로 빠르게 만들 수 있습니다.
그럼 이 제네릭 뷰를 사용하여 저번에 작성한 아래 코드의 클래스 뷰를 변경시켜 보겠습니다.
# 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})
변경 후 코드는 아래와 같습니다!
from django.views.generic import CreateView
from django.urls import reverse
class PostCreateView(CreateView):
model = Page
form_class = PageForm
template_name = 'diary/page_form.html'
def get_success_url(self):
return reverse('page-detail', kwargs={'page_id': self.object.id})
코드 길이만 봐도 훨씬 내용이 간결해진 것을 알 수있는데요.
이제 각 코드가 어떤 걸 의미하는지 알아보겠습니다.
제네릭은 필요한 값들을 정해진 변수에 입력받는 형식으로 사용합니다.
이때 model에는 사용할 모델을 적어주고, form_class에는 유저에게 글 작성을 위해 보여줄 폼을 작성한 것을 넘겨주고,
렌더 할 템플릿은 template_name에 넘겨주면 됩니다.
다만 함수형 뷰와 비교해보면 함수형 뷰는 사전형으로 'form'이라는 키로 context를 전달하지만 Generic CreateView는
이러한 context를 따로 적어주지 않아도 작성한 Form 클래스에 해당하는 폼을 form이란 키워드로 템플릿에 전달합니다.
그 후 성공적으로 작동했을 경우, 디테일 페이지로 이동시켜주는데 이때 처음 보는 reverse라는 것을 사용합니다.
reverse는 이름과 같이 URL 네임 속성으로부터 거슬러 올라가 URL을 찾는다는 의미입니다.
그리고 뒷부분의 kwargs는 keyword argument의 약자로 지금처럼 사전형으로 키워드를 이용해 값을 전달할 때 사용하는 인자입니다.
이때 self.object를 사용하면 현재 새로 생성된 데이터 객체에 접근할 수 있기 때문에 self.object.id를 사용했습니다.
'Study > Django' 카테고리의 다른 글
[Django] Django 클래스형 뷰 ( Generic View- DetailView) # 4 (0) | 2021.12.14 |
---|---|
[Django] Django 클래스형 뷰 ( Generic View- ListView) # 3 (0) | 2021.12.14 |
[Django] Django 클래스형 뷰 ( Class-Based Views ) # 1 (0) | 2021.12.14 |
[Django] django.core.exceptions.ImproperlyConfigured Error (0) | 2021.12.12 |
Django NoReverseMatch at Error (0) | 2021.12.12 |