11from django .shortcuts import render , get_object_or_404
22from django .views .generic import View , ListView , DetailView , TemplateView
3+ from django .contrib .postgres .search import SearchVector , SearchQuery , SearchRank
34from django .views .generic .edit import FormMixin
5+ from django .db .models import Count
46from taggit .models import Tag
57
6- from .models import Post
7-
8+ from .models import Post , Comment
9+ from . forms import CommentForm
810
911class 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
2739class 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