Class-Based Views 공식문서
generic view
ListView, DetailView, CreateView)를 사용해 일반적인 패턴을 쉽게 구현지금까지 했던 방법

한줄로 처리 가능

이전보다 좀더 간결하게 변경

어바웃 페이지로 이동하는 리다이렉트 뷰(기본 방법 / 익명함수 lambda를 사용하는 방법)
path('redirect/', RedirectView.as_view(pattern_name='about'), name='redirect')
http://127.0.0.1:8000/redirect/ pattern_name과 동일 이름으로 이동

# blog/cb_views.py
from django.db.models import Q
from django.views.generic import ListView
from blog.models import Blog
class BlogListView(ListView): # ListView 상속
queryset = Blog.objects.all()
template_name = 'blog_list.html' # 렌더링
paginate_by = 10 # 페이지네이션
ordering = ('-created_at', ) # 역정렬
# ListView 내장 함수
# 검색기능
def get_queryset(self):
queryset = super().get_queryset()
q = self.request.GET.get('q')
if q:
queryset = queryset.filter(
Q(title__icontains=q) |
Q(content__icontains=q)
)
return queryset


페이지네이션 / 역정렬 추가

검색기능 추가


## 커스터마이징 부분
class BlogDetailView(DetailView):
"""
1. 이 속성은 URL에서 데이터를 찾을때 사용할 키 이름을 바꿔주는 것
보통 Django는 pk를 기준으로 데이터를 찾는데, 만약 URL 에서 id라는 이름을 쓰고 싶으면 이걸로 바꿔야함
URL이 blog/5/ 라면 pk를 쓰고, URL이 blog/<int:id>/라면 id를 씀
"""
pk_url_kwarg = 'id'
"""
2. get_queryset 메서드는 어떤 데이터를 보여줄지 결정하는 것으로 데이터전체에서 필터링하는 느낌
블로그 글이 100개 있는데, id=50이하인 글만 보여주고 싶을 때 사용
queryset = super().get_queryset() # 전체 데이터 가져오기
return queryset.filter(id__lte=50) # 그 중에서 id가 50 이하인 것만 골라내기
결과는 50번째 글까지만 보여줌
"""
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(id__lte=50)
"""
3. get_object 메서드는 URL에서 특정 글(데이터) 하나를 가져오는 방법을 바꾸는것
지금은 별로 바뀌는게 없지만, 나중에 더 복잡한 조건(ex.이 글을 작성한 사람만 볼 수 있다) 같은 걸 추가가능
object = super().get_object() # 기본 방식으로 글 하나 가져오기
object = self.model.objects.get(pk=self.kwargs.get('pk')) # 다시 글 찾기
self.model.objects.get()은 pk = 5인 데이터를 데이터베이스에서 직접 가져오는 방법
self.kwargs.get('pk') 는 URL에서 pk값을 가져옴
결과는 그냥 글 하나 가져오는 기본 방식이랑 거의 똑같지만, 나중에 수정할 준비를 해둔 것
"""
def get_object(self, queryset=None):
object = super().get_object()
object = self.model.objects.get(pk=self.kwargs.get('pk'))
return object
"""
4. 템플릿 추가로 데이터를 전달하는 것으로 템플릿에서 사용할 수 있는 변수를 더 만드는 것
템플릿에 CBV라는 텍스트를 표시하고 싶을때 쓸 수 있음
결과는 템플릿에서 {{ test }} 를 쓰면 CBV라는 값이 나옴
context = super().get_context_data(**kwargs) # 기본 데이터 가져오기
context['test'] = 'CBV' # 추가로 test라는 이름으로 'CBV' 넣기
"""
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['test'] = 'CBV'
return context
LoginRequiredMixin
CreateView

블로그 작성 페이지까지는 들어갔지만 생성이 안되는 오류 해결

변경가능한 pk가 필요할 경우
http://127.0.0.1:8000/cb/ 로 가짐http://127.0.0.1:8000/cb/175/ 작성한 글에 대한 상세페이지로 가짐
# 1
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
# 2
def form_valid(self, form):
blog = form.save(commit=False)
blog.author = self.request.user
blog.save()
self.object = blog
return HttpResponseRedirect(self.get_success_url())


# 1
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(author=self.request.user)
# 2
def get_object(self, queryset = None):
self.object = super().get_object(queryset)
if self.object.author != self.request.user:
raise Http404
return self.object



Admin 계정으로 로그인 한 경우 일반페이지에서도 글 관리가 가능하도록
user2 가 작성한 글을 admin이 수정이나 삭제가 불가







Command 누르고 클릭해보면 함수의 사용법을 알 수 있음


pycharm 에서 cmd + R

pycharm 에서 cmd+, -> 키맵 -> caret

cmd + shift + F = 전체검색
문제 1. BlogCreateView 를 사용하면서 urls까지 해놓고 연결해봤는데 연결 안됨
원인 : 에러 페이지에서 말했듯 필드가 fields 가 필요

해결
