class PostList(ListView): # ListView를 상속받은 Class
model = Post # Post 모델 사용
ordering = '-pk' # 포스트 최신순 정렬
paginate_by = 5 # 한 페이지에 5개 포스트 표시
# 카테고리 레코드 추가를 위한 함수 오버라이딩
def get_context_data(self,**kwargs):
context = super(PostList,self).get_context_data()
context['categories'] = Category.objects.all()
context['no_category_post_count'] = Post.objects.filter(category=None).count()
return context
ListView, DetailView에 내장된 메서드
model = 모델 이라고 선언하면 get_context_data에서 자동으로 모델_list = 모델.objects.all() 명령
따라서 모델_list.html에서 {% for 레코드 in 모델_list %} 바로 사용 가능
본 코드에서는 카테고리 기능을 사용하기 위해 get_context_data 오버라이딩
class PostDetail(DetailView):
model = Post
def get_context_data(self,**kwargs):
context = super(PostDetail,self).get_context_data()
context['categories'] = Category.objects.all()
context['no_category_post_count'] = Post.objects.filter(category=None).count()
context['comment_form'] = CommentForm
return context
class PostCreate(LoginRequiredMixin,UserPassesTestMixin,CreateView):
model = Post
fields = ['title','hook_text','content','head_image','file_upload','category']
def test_func(self):
return self.request.user.is_superuser or self.request.user.is_staff
# form_valid 재정의
def form_valid(self,form):
current_user = self.request.user
if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
form.instance.author = current_user
response = super(PostCreate,self).form_valid(form)
tags_str = self.request.POST.get('tags_str')
if tags_str:
tags_str = tags_str.strip()
tags_str = tags_str.replace(',',';')
tags_list = tags_str.split(';')
for t in tags_list:
t = t.strip()
tag,is_tag_created = Tag.objects.get_or_create(name=t)
if is_tag_created:
tag.slug = slugify(t,allow_unicode = True)
tag.save()
self.object.tags.add(tag)
return response
else:
return redirect('/blog/')
클라이언트가 서버에 요청해서 서버가 제공해야하는 자원이 있다.
Ex)
클라이언트가 로그인을 하려고 한다.
아이디와 패스워드를 입력하고 올바른 정보인지 서버로부터 확인을 해야한다.
위와 같은 상황에서 클라이언트는 서버로부터 request를 보내야 한다.
GET 방식과 POST 방식 모두 서버에 request를 하는 것이지만
결정적인 차이는 다음과 같다.
Ex)
ID: happyeon PW: 1234
회원정보가 위와 같다. 이 상황에서 GET 메소드를 이용하면
www.xxx.com?id=happyeon&pass=1234
이렇게 보내게 된다. URL뒤에 "?"를 통해 데이터 표현의 시작점을 알린다 그리고 "&"을 통해 key-value쌍을 구분한다.
class PostUpdate(LoginRequiredMixin,UpdateView):
model = Post
fields = ['title','hook_text','content','head_image','file_upload','category','tags']
template_name = 'blog/post_update_form.html'
def get_context_data(self, **kwargs):
context = super(PostUpdate, self).get_context_data()
if self.object.tags.exists():
tags_str_list = list()
for t in self.object.tags.all():
tags_str_list.append(t.name)
context['tags_str_default'] = '; '.join(tags_str_list)
return context
def form_valid(self, form):
response = super(PostUpdate, self).form_valid(form)
self.object.tags.clear()
tags_str = self.request.POST.get('tags_str')
if tags_str:
tags_str = tags_str.strip()
tags_str = tags_str.replace(',', ';')
tags_list = tags_str.split(';')
for t in tags_list:
t = t.strip()
tag, is_tag_created = Tag.objects.get_or_create(name=t)
if is_tag_created:
tag.slug = slugify(t,allow_unicode = True)
tag.save()
self.object.tags.add(tag)
return response
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and request.user == self.get_object().author:
return super(PostUpdate,self).dispatch(request,*args,**kwargs)
else:
raise PermissionDenied
class CommentUpdate(LoginRequiredMixin,UpdateView):
model = Comment
form_class = CommentForm
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated and request.user == self.get_object().author:
return super(CommentUpdate, self).dispatch(request,*args,**kwargs)
else:
raise PermissionDenied
class PostSearch(PostList):
paginate_by = None
def get_queryset(self):
q = self.kwargs['q']
post_list = Post.objects.filter(
Q(title__contains = q) | Q(tags__name__contains=q)
).distinct()
return post_list
def get_context_data(self,**kwargs):
context = super(PostSearch, self).get_context_data()
q = self.kwargs['q']
context['search_info'] = f'Search: {q} ({self.get_queryset().count()})'
return context
def category_page(request,slug):
if slug == 'no_category':
category = '미분류'
post_list = Post.objects.filter(category=None)
else:
category = Category.objects.get(slug=slug)
post_list = Post.objects.filter(category=category)
return render(
request,
'blog/post_list.html',
{
'post_list':post_list,
'categories':Category.objects.all(),
'no_category_post_count':Post.objects.filter(category=None).count(),
'category': category,
}
)
def tag_page(request,slug):
tag = Tag.objects.get(slug=slug)
post_list = tag.post_set.all()
return render(
request,
'blog/post_list.html',
{
'post_list': post_list,
'tag': tag,
'categories': Category.objects.all(),
'no_category_post_count': Post.objects.filter(category=None).count(),
}
)
def new_comment(request,pk):
if request.user.is_authenticated:
post = get_object_or_404(Post,pk=pk)
if request.method == 'POST':
comment_form = CommentForm(request.POST)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.post = post
comment.author = request.user
comment.save()
return redirect(comment.get_absolute_url())
else:
return redirect(post.get_absolute_url())
else:
raise PermissionDenied
Ex) 127.0.0.1:8000/10/new_comment
def delete_comment(request,pk):
comment = get_object_or_404(Comment,pk=pk)
post = comment.post
if request.user.is_authenticated and request.user == comment.author:
comment.delete()
return redirect(post.get_absolute_url())
else:
raise PermissionDenied