diff options
| author | Bobby <[email protected]> | 2023-04-27 03:05:18 -0400 |
|---|---|---|
| committer | Bobby <[email protected]> | 2023-04-27 03:05:18 -0400 |
| commit | 08f57b0f8029ee5f45adba91ceb31e07a7bd65fd (patch) | |
| tree | 56557ff613b48b93b0ffb8c565fe6ac3d4e10efe /blog/views.py | |
| parent | 6e3748deb07a4916c516a6b38197a29b91f35c8a (diff) | |
| download | thatcomputerscientist-08f57b0f8029ee5f45adba91ceb31e07a7bd65fd.tar.xz thatcomputerscientist-08f57b0f8029ee5f45adba91ceb31e07a7bd65fd.zip | |
Inworks Search using `haystack`
Diffstat (limited to 'blog/views.py')
| -rw-r--r-- | blog/views.py | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/blog/views.py b/blog/views.py index 01e0379b..acab2d74 100644 --- a/blog/views.py +++ b/blog/views.py @@ -13,6 +13,7 @@ from users.forms import RegisterForm, UpdateUserDetailsForm from users.tokens import CaptchaTokenGenerator from django.contrib import messages from bs4 import BeautifulSoup +from haystack.query import SearchQuerySet import re import os from dotenv import load_dotenv @@ -195,40 +196,26 @@ def delete_comment(request, slug, comment_id): def search(request): - categories = Category.objects.all() - tags = request.GET.get('tags') - category = request.GET.get('category') - query = request.GET.get('query') - search_in_body = False - - # First check for query constraints - if len(query) == 0: - return render(request, 'blog/search.html', {'title': 'Search', 'posts': [], 'categories': categories, 'tags': tags, 'cate': category, 'query': query}) - - if len(query) < 3: - return render(request, 'blog/search.html', {'title': 'Search', 'posts': [], 'categories': categories, 'tags': tags, 'cate': category, 'query': query, 'error': 'Query must be at least 3 characters long'}) - - if len(query) > 100: - search_in_body = True - - # public posts which contain the query in the title or body - posts = Post.objects.filter(is_public=True, title__icontains=query) if not search_in_body else Post.objects.filter(is_public=True, body__icontains=query) | Post.objects.filter(is_public=True, title__icontains=query) + query = request.GET.get('q') + search_in = request.GET.getlist('search_in') if request.GET.get('search_in') else ['posts'] + sort_by = request.GET.get('sort_by') if request.GET.get('sort_by') else 'relevance' + order = request.GET.get('order') if request.GET.get('order') else 'ascending' + date_range = request.GET.get('date_range') if request.GET.get('date_range') else 'any' + search_model_map = { + 'posts': Post, + 'users': User, + } - # filter by category slug - if category: - posts = posts.filter(category__slug=category) - else: - category = '' + if query: + search_results = SearchQuerySet().filter(content=query) + if search_in: + search_results = search_results.models(*[search_model_map[model] for model in search_in]) - # filter by tags - if tags: - posts = posts.filter(tags__name__in=tags.split(',')) + search_results = [result.object for result in search_results] else: - tags = '' + search_results = None - # order by date - posts = posts.order_by('-date') - return render(request, 'blog/search.html', {'title': 'Search', 'posts': posts, 'categories': categories, 'tags': tags, 'cate': category, 'query': query}) + return render(request, 'blog/search.html', {'title': f"Search results for '{query}'", 'query': query, 'search_results': search_results, 'search_in': search_in, 'sort_by': sort_by, 'order': order, 'date_range': date_range}) def articles(request, date=None, cg=None): type = 'articles' |
