Skip to content

Commit 6708b16

Browse files
committed
Update views.py
1 parent 1681875 commit 6708b16

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

blog/views.py

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,44 @@
11
from django.shortcuts import render, get_object_or_404
22
from django.views.generic import View, ListView, DetailView, TemplateView
3+
from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank
34
from django.views.generic.edit import FormMixin
5+
from django.db.models import Count
46
from taggit.models import Tag
57

6-
from .models import Post
7-
8+
from .models import Post, Comment
9+
from .forms import CommentForm
810

911
class PostListView(ListView):
1012
paginate_by = 3
1113
template_name = 'blog/post-list.html'
1214

13-
def get_queryset(self):
15+
def get_queryset(self, **kwargs):
1416
queryset = Post.published.all()
1517
tag_slug = self.kwargs.get('tag_slug')
18+
query = self.request.GET.get('query')
1619
if tag_slug:
1720
tag = get_object_or_404(Tag, slug=tag_slug)
1821
queryset = queryset.filter(tags__in=[tag])
22+
if query:
23+
search_vector = SearchVector('title', weight='A')+\
24+
SearchVector('body', weight='B')
25+
search_query = SearchQuery(query)
26+
27+
queryset = Post.published.annotate(
28+
rank=SearchRank(search_vector, search_query)
29+
).filter(rank__gte=0.3).order_by('-rank')
1930
return queryset
2031

2132
def get_context_data(self, **kwargs):
2233
context = super().get_context_data(**kwargs)
2334
context["tag"] = self.kwargs.get('tag_slug')
35+
context["query"] = self.request.GET.get('query')
2436
return context
2537

2638

2739
class PostDetailView(FormMixin, DetailView):
2840
template_name = 'blog/post-detail.html'
41+
form_class = CommentForm
2942

3043
def get_object(self):
3144
obj = get_object_or_404(Post, status='published',
@@ -36,6 +49,34 @@ def get_object(self):
3649
)
3750
return obj
3851

52+
def get_success_url(self):
53+
return self.get_object().get_absolute_url()
54+
55+
def get_context_data(self, **kwargs):
56+
context = super().get_context_data(**kwargs)
57+
post = self.get_object()
58+
59+
post_tags_ids = post.tags.values_list('id', flat=True)
60+
similar_posts = Post.published.filter(tags__in=post_tags_ids)\
61+
.exclude(id=post.id)
62+
similar_posts = similar_posts.annotate(same_tags=Count('tags'))\
63+
.order_by('-same_tags','-publish')[:4]
3964

40-
class PostSearchView(TemplateView):
41-
template_name = 'blog/post-search.html'
65+
comments = Comment.objects.filter(post=post, active=True)
66+
context["similar_posts"] = similar_posts
67+
context['comments'] = comments
68+
context['form'] = self.get_form()
69+
return context
70+
71+
def post(self, request, *args, **kwargs):
72+
self.object = self.get_object()
73+
form = self.get_form()
74+
75+
if form.is_valid():
76+
comment = form.save(commit=False)
77+
comment.post = self.get_object()
78+
comment.save()
79+
return self.form_valid(form)
80+
else:
81+
print("Invalid form")
82+
return self.form_invalid(form)

0 commit comments

Comments
 (0)