View
๐ก Generic View
Django๋ ์น ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ก์ง์ ๋ฏธ๋ฆฌ ๊ฐ๋ฐํด๋๊ณ
๊ธฐ๋ณธ ํด๋์ค๋ก ์ ๊ณตํ๊ณ ์๋๋ฐ, ์ด๋ค์ Generic View๋ผ๊ณ ํ๋ค.
from django.views.generic import ~
ํด๋์คํ ๋ทฐ๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ํด๋์คํ ์ ๋ค๋ฆญ ๋ทฐ๋ฅผ ์์๋ฐ์์ ํ์ํ
์์ฑ๊ณผ overridingํ๋ ์์ ์ด ํ์ํ๋ค.
๐ Base View
โช View : ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ์ต์์ Generic View.
โช TemplateView : ํ ํ๋ฆฟ์ด ์ฃผ์ด์ง๋ฉด ํด๋น ํ ํ๋ฆฟ์ ๋ ๋๋งํด์ค๋ค.
โช RedirectView : URL์ด ์ฃผ์ด์ง๋ฉด ํด๋น URL๋ก ๋ฆฌ๋ค์ด๋ ํธ ์์ผ์ค๋ค.
๐ Generic Display View
โช ListView : ์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค๋ค.
โช DetailView : ๊ฐ์ฒด ํ๋์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋ค.
๐ Generic Edit View
โช FormView : ํผ์ด ์ฃผ์ด์ง๋ฉด ํด๋น ํผ์ ๋ณด์ฌ์ค๋ค.
โช CreatView : ํผ์ ๋ณด์ฌ์ฃผ๊ณ ํผ์ ๋ด์ฉ์ผ๋ก DB๋ ์ฝ๋๋ฅผ ์ ๊ท ์์ฑํ๋ค.
โช UpdateView : ํผ์ ๋ณด์ฌ์ฃผ๊ณ ํผ์ ๋ด์ฉ์ผ๋ก ๊ธฐ์กด DB๋ ์ฝ๋๋ฅผ ์์ ํ๋ค.
โช DeleteView : ์ญ์ ์ปจํ ํผ์ ๋ณด์ฌ์ฃผ๊ณ , ๊ธฐ์กด DB๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ค.
๐ Generic Date View
โช ArchiveIndexView : ์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด ๋ฐ ๊ทธ ๊ฐ์ฒด๋ค์ ๋ํ ๋ ์ง ์ ๋ณด.
โช YearArchiveView : ์ฐ๋๊ฐ ์ฃผ์ด์ง๋ฉด ๊ทธ ์ฐ๋์ ํด๋นํ๋ ๊ฐ์ฒด๋ค์ ๋ณด์ฌ์ค๋ค.
โช MonthArchiveView : ์ฐ,์์ด ์ฃผ์ด์ง๋ฉด ๊ทธ์ ํด๋นํ๋ ๊ฐ์ฑ๋ค์ ๋ณด์ฌ์ค๋ค.
โช WeekArchiveView : ์ฐ๋์ ์ฃผ๊ฐ ์ฃผ์ด์ง๋ฉด ๊ทธ์ ํด๋นํ๋ ๊ฐ์ฒด๋ค์ ๋ณด์ฌ์ค๋ค.
โช DayArchiveView : ์ฐ,์,์ผ์ด ์ฃผ์ด์ง๋ฉด ๊ทธ์ ํด๋นํ๋ ๊ฐ์ฒด๋ค์ ๋ณด์ฌ์ค๋ค.
โช TodayArchiveView : ์ค๋ ๋ ์ง์ ํด๋นํ๋ ๊ทธ์ ํด๋นํ๋ ๊ฐ์ฒด๋ค์ ๋ณด์ฌ์ค๋ค.
โช DateDetailView : ์ฐ,์,์ผ ๊ธฐ๋ณธํค(๋๋ ์ฌ๋ฌ๊ทธ)๊ฐ ์ฃผ์ด์ง๋ฉด ํด๋นํ๋ ๊ฐ์ฒด์ ์ ๋ณด ๋ฐํ.
๐ View
๋ชจ๋ ํด๋์คํ ๋ทฐ์ ๊ธฐ๋ณธ์ด ๋๋ ์ต์์ ๋ทฐ์ด๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํด๋์คํ ๋ทฐ๋
์ด View ํด๋์ค๋ฅผ ์์ ๋ฐ๋๋ค. ์๋์ ๊ฐ์ด ์ค์ค๋ก ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค.
class TestView(View):
def get(self,request,*args,**kwargs):
return HttpResponse('Hello')
โน โ๐ผView ์์ค์ฝ๋
๐ TemplateView
TemplateView๋ ๋จ์ํ ํ๋ฉด์ ๋ณด์ฌ์ค ํ ํ๋ฆฟ์ ํ์ผ์ ์ฒ๋ฆฌํ๋ ์ ๋์ ๊ฐํ๋จ ๋ทฐ์ด๋ค.
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
TemplateResponseMixin |
ContextMixin |
View |
from django.views.generic import TemplateView
# views.py
class MainView(TemplateView):
template_name = 'main/home.html'
# urls.py์ ๋ฐ๋ก ์ฝ๋ฉํ ๋.
urlpatterns = [
path('/',TemplateView.as_view(template_name = 'main/home.html'),name='main')
]
โน โ๐ผTemplateView ์์ค์ฝ๋
๐ RedirectView
RedirectView๋ ์ฃผ์ด์ง URL๋ก ๋ฆฌ๋ค์ด๋ ํธ ์์ผ์ฃผ๋ ์ ๋ค๋ฆญ ๋ทฐ๋ค.
๊ทธ๋์ URL์์ฑ์ด ํ์์ด๋ค. URL์ด ์๋ค๋ฉด URL ํจํด๋ช ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
View |
โน โ๐ผRedirectView ์์ค์ฝ๋
๐ DetailView
DetailView๋ ListView์ ๋๋ถ์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ ๋ค๋ฆญ ๋ทฐ์ด๋ค.
DetailView๋ ํน์ ๊ฐ์ฒด ํ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ทฐ์ด๋ค.
ํ ํ๋ฆฟ ํ์ผ์์๋ object ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๋ ์ ๋ณด๋ค์ ์ถ๋ ฅํ๋ค.
DetailView๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํ ์ด๋ธ์ ๋ทฐ ํด๋์ค์์ ์ง์ ํ๊ณ ,
๋ ์ฝ๋ ๊ฒ์์ฉ ํค๋ URLconf์์ ์ง์ ํด ์ค์ผํ๋ค.
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
SingleObjectTemplateResponseMixin |
TemplateResponseMixin |
BaseDetailView |
SingleObjectMixin |
ContextMixin |
View |
from django.views.generic import DetailView
class PostDetailView(DetailView):
model = Post
# ์ค๋ฒ๋ผ์ด๋ฉ
def get_queryset(self):
qs = super().get_queryset()
if request.user.is_authenticated:
qs = qs.filter(is_public=True)
return qs
#-- urls.py
re_path(r'^post/?P<slug>[-w\]+)/$', views.PostDetailView.as_view(),name='detail')
โน โ๐ผDetailView ์์ค์ฝ๋
๐ ListView
LitsView๋ ์ฌ๋ฌ ๊ฐ์ฒด์ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ทฐ์ด๋ค.
ํ ํ๋ฆฟ ํ์ผ์์๋ object_list ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๋ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
MultipleObjectTemplateResponseMixin |
TemplateResponseMixin |
BaseListView |
MultipleObjectMixin |
ContextMixin |
View |
from django.views.generic import ListView
class PostListView(ListView):
model = Post
template_name = 'instagram/post_list.html'
context_object_name = 'posts' # default : object_list
paginate_by = 2
โน โ๐ผLitsView ์์ค์ฝ๋
๐ FormView
ํผ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ ๋ค๋ฆญ ๋ทฐ์ด๋ค. ๊ทธ๋์ ํผ์ ์ง์ ํด์ฃผ๋ form_class์ ์ด ํผ์
๋๋๋งํ๋๋ฐ ํ์ํ template_name ์์ฑ์ด ์ฃผ์ ์์ฑ์ค ํ๋์ด๋ค. ์ถ๊ฐ์ ์ผ๋ก ํผ
์ฒ๋ฆฌ๊ฐ ์ฑ๊ณตํ ํ์ ๋ฆฌ๋ค์ด๋ ํธ URL์ ์ง์ ํ๋ success_url ์์ฑ๋ ํ์ํ๋ค.โ
FormView์ ๋์ ๋ฐฉ์์ get() ๋ฉ์๋์ post() ๋ฉ์๋์ ๋ง๋ ํผ์ ๋ณด์ฌ์ค ๋ค์, ์ฌ์ฉ์๊ฐ
ํผ์ ์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ์ ์ฉํ์ง ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๊ณ , ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ์ ๋นํ ํ์ด์ง๋ก
์ด๋์ ํ๋ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ค.
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
TemplateResponseMixin |
BaseFormView |
FormMixin |
ContextMixin |
ProcessFormView |
View |
from django.views.generic import FormView
class SearchFormView(FormView):
form_class = SearchForm
template_name = 'instagram/post_search.html'
# success_url = 'instagram:post_list'
def form_valid(self,form):
word = form.cleaned_data.get('search_word')
post_list = Post.objects.filter(
Q(title__icontains=word) |
Q(description__icontains=word) |
Q(content__icontains=word))
context = {
'form':form,
'word':word,
'post_list':post_list,
}
return render(self.request, self.template_name, context)
โน โ๐ผFormView ์์ค์ฝ๋
๐ CreateView
CreateView๋ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์์ฑํด์ ํ ์ด๋ธ์ ์ ์ฅํด์ฃผ๋ ๋ทฐ์ด๋ค.
์๋ก์ด ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๋ ์ฝ๋ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ์ ์๋ ํผ์ด ํ์ํ๋ค.
๊ทธ๋์ CreateView๋ FormView์ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ์๋ค.
CreateView๋ ํญ์ ์์ ๋์์ด ๋๋ ํ ์ด๋ธ์ด ์์ผ๋ฏ๋ก,
๊ทธ ํ ์ด๋ธ ์ ์๋ก๋ถํฐ ํผ์ ๋ง๋ค ์ ์๋ค.
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
SingleObjectTemplateResponseMixin |
TemplateResponseMixin |
BaseCreateView |
ModelFormMixin |
FormMixin |
SingleObjectMixin |
ContextMixin |
ProcessFormView |
View |
from django.views.generic import CreateView
class PostCreatView(CreatView):
model = Post
# ํผ์ ๋ง๋ค ๋ ์ฌ์ฉํ ํ๋ ์ ์
fields = []
# ์์ฑ ํ ์ด๋ํ URL
success_url = reverse_lazy('instagram:post_list')
def form_valid(self,form):
form.instance.owner = self.request.user
# ModelFormMixin ํด๋์ค์ form_valid() ์์ save๋จ.
return super().form_valid(form)
โน โ๐ผCreateView ์์ค์ฝ๋
๐ UpdateView
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
SingleObjectTemplateResponseMixin |
TemplateResponseMixin |
BaseUpdateView |
ModelFormMixin |
FormMixin |
SingleObjectMixin |
ContextMixin |
ProcessFormView |
View |
#-- views.py
from django.views.generic import UpdateView
class PostUpdateView(UpdateView):
model = Post
fields = []
success_url = reverse_lazy('instagram:post_list')
PostUpdateView = PostUpdateView.as_view()
#-- urls.py
path('<int:pk>/update/', views.PostUpdateView, name='update')
โน โ๐ผUpdateView ์์ค์ฝ๋
๐ DeleteView
๋ถ๋ชจ ํด๋์ค(MRO) |
---|
SingleObjectTemplateResponseMixin |
TemplateResponseMixin |
BaseDeleteView |
DeletionMixin |
BaseDetailView |
SingleObjectMixin |
ContextMixin |
View |
#-- views.py
from django.views.generic import DeleteView
class PostDeleteView(DeleteView):
model = Post
success_url = reverse_lazy('instagram:post_list')
PostDeleteView = PostDeleteView.as_view()
#-- urls.py
path('<int:pk>/delete/', views.PostDeleteView, name='delete')
โน โ๐ผDeleteView ์์ค์ฝ๋
GENERIC DATES
GENERIC DATES VIEW | object list | date list |
---|---|---|
ArchiveIndexView | ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ | ๋์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ) |
YearArchiveView | ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ) | ๋์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์) |
MonthArchiveView | ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ/์) | ๋์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ผ) |
WeekArchiveView | ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ/์ฃผ) | ๋์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ) |
DayArchiveView | ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ/์/์ผ) | ๋์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ) |
TodayArchiveView | ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ค๋) | ๋์ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ(์ฐ) |
DateDetailView | ํด๋น ๋ณ์ ์์ | ํด๋น ๋ณ์ ์์ |
๐ก Generic View Overricing
๐ queryset vs get_queryset()
๋ ๊ฐ ๋ชจ๋ ์ถ๋ ฅ ๋์์ ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ๋์ ์ผ๋ก ์ถ๋ ฅ ๋์์ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ get_queryset() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
๐ get_context_data() ๋ฉ์๋
๋ทฐ์์ ํ ํ๋ฆฟ ํ์ผ์ ๋๊ฒจ์ฃผ๋ ์ปจํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['SearchWord'] = self.kwargs['word'] # ์ถ๊ฐ
return context