diff options
| author | Bobby <[email protected]> | 2022-12-29 06:07:39 -0500 |
|---|---|---|
| committer | Bobby <[email protected]> | 2022-12-29 06:07:39 -0500 |
| commit | 5c5493387bbcd6d0b025d395df77ae48af65508e (patch) | |
| tree | dd54bda7698c45c6a7334fa88b9bc860d683b03a | |
| parent | 8ae5991bb2481f5fc1de7b9012adcc4ae2e39aba (diff) | |
| download | thatcomputerscientist-5c5493387bbcd6d0b025d395df77ae48af65508e.tar.xz thatcomputerscientist-5c5493387bbcd6d0b025d395df77ae48af65508e.zip | |
Some makeshift search page.; I'm tired now. Maybe I'll watch Konosuba
| -rw-r--r-- | blog/urls.py | 3 | ||||
| -rw-r--r-- | blog/views.py | 40 | ||||
| -rw-r--r-- | templates/blog/partials/sidebar.html | 4 | ||||
| -rw-r--r-- | templates/blog/search.html | 40 |
4 files changed, 83 insertions, 4 deletions
diff --git a/blog/urls.py b/blog/urls.py index 03e6c13d..526093cc 100644 --- a/blog/urls.py +++ b/blog/urls.py @@ -6,7 +6,8 @@ app_name = 'blog' urlpatterns = [ path('', views.home, name='home'), path('account', views.account, name='account'), - path('register/', views.register, name='register'), + path('register', views.register, name='register'), + path('search', views.search, name='search'), path('articles/<str:slug>', views.post, name='post'), path('articles/<str:slug>/comment', views.comment, name='comment'), path('articles/<str:slug>/edit_comment', views.edit_comment, name='edit_comment'), diff --git a/blog/views.py b/blog/views.py index fd8d76f5..96faa177 100644 --- a/blog/views.py +++ b/blog/views.py @@ -5,7 +5,7 @@ from users.models import UserProfile import hashlib from random import choice from string import ascii_letters, digits -from .models import Post, Comment +from .models import Category, Post, Comment from .context_processors import recent_posts, avatar_list from announcements.models import Announcement from users.forms import RegisterForm @@ -167,3 +167,41 @@ def delete_comment(request, slug, comment_id): return HttpResponse('Comment not found!', status=404) else: return redirect('blog:home') + + +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) + + # filter by category slug + if category: + posts = posts.filter(category__slug=category) + else: + category = '' + + # filter by tags + if tags: + posts = posts.filter(tags__name__in=tags.split(',')) + else: + tags = '' + + # 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}) + diff --git a/templates/blog/partials/sidebar.html b/templates/blog/partials/sidebar.html index 00be99cc..b7903bff 100644 --- a/templates/blog/partials/sidebar.html +++ b/templates/blog/partials/sidebar.html @@ -47,8 +47,8 @@ <div id="search-area" {% if not user.is_authenticated %}class="mtsbitem"{% endif %}> <h2>Search</h2> - <form action="#" method="GET"> - <input type="text" name="q" placeholder="Search..." autocomplete="off" style="width: 166px;"> + <form action="{% url 'blog:search' %}" method="get"> + <input type="text" name="query" placeholder="Search..." autocomplete="off" style="width: 166px;" value="{{ request.GET.query }}"> <input type="submit" align="center" class="button button-special" value="Search" style="width: 60px;"> </form> </div> diff --git a/templates/blog/search.html b/templates/blog/search.html new file mode 100644 index 00000000..f9eaa71e --- /dev/null +++ b/templates/blog/search.html @@ -0,0 +1,40 @@ +{% extends 'blog/partials/base.html' %} {% block content %} + +<div id="search-banner"> + <h1>Combine your search terms:</h1> + <form action="{% url 'blog:search' %}" method="get"> + <label for="query">Search for:</label> + <input type="text" name="query" value="{{ query }}" /> + <label for="tags">With tags (separate with commas):</label> + <input type="text" name="tags" value="{{ tags }}" /> + <label for="category">In category:</label> + <select name="category"> + <option value="" {% if cate == '' %}selected{% endif %}>All categories</option> + {% for category in categories %} + <option value="{{ category.slug }}" {% if category.slug == cate %}selected{% endif %}>{{ category.name }}</option> + {% endfor %} + </select> + <input type="submit" value="Search" /> + </form> +</div> + +{% if posts %} + <div id="search-results"> + <h2>Search results for "{{ query }}"</h2> + <ul> + {% for post in posts %} + <li> + <a href="{% url 'blog:post' post.slug %}">{{ post.title }}</a> + <p>{{ post.excerpt }}</p> + </li> + {% endfor %} + </ul> + </div> +{% else %} + <div id="search-results"> + <h2>No results found for "{{ query }}"</h2> + </div> +{% endif %} + + +{% endblock %}
\ No newline at end of file |
