Implement tag search
This commit is contained in:
parent
4658ec9d7b
commit
ff68d2591f
@ -29,17 +29,25 @@ def query_bookmarks(user: User, query_string: str):
|
||||
# Filter for user
|
||||
query_set = query_set.filter(owner=user)
|
||||
|
||||
# Split query into keywords
|
||||
# Split query into search terms and tags
|
||||
keywords = query_string.strip().split(' ')
|
||||
keywords = [word for word in keywords if word]
|
||||
|
||||
# Filter for each keyword
|
||||
for word in keywords:
|
||||
search_terms = [word for word in keywords if word[0] != '#']
|
||||
tag_names = [word[1:] for word in keywords if word[0] == '#']
|
||||
|
||||
# Filter for search terms and tags
|
||||
for term in search_terms:
|
||||
query_set = query_set.filter(
|
||||
Q(title__contains=word)
|
||||
| Q(description__contains=word)
|
||||
| Q(website_title__contains=word)
|
||||
| Q(website_description__contains=word)
|
||||
Q(title__contains=term)
|
||||
| Q(description__contains=term)
|
||||
| Q(website_title__contains=term)
|
||||
| Q(website_description__contains=term)
|
||||
)
|
||||
|
||||
for tag_name in tag_names:
|
||||
query_set = query_set.filter(
|
||||
tags__name=tag_name
|
||||
)
|
||||
|
||||
# Sort by modification date
|
||||
|
@ -1,3 +1,10 @@
|
||||
.bookmarks-page {
|
||||
|
||||
.search input[type=search] {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
ul.bookmark-list {
|
||||
|
||||
list-style: none;
|
||||
|
@ -3,7 +3,7 @@
|
||||
{% load bookmarks %}
|
||||
|
||||
{% block content %}
|
||||
<div class="columns">
|
||||
<div class="bookmarks-page columns">
|
||||
|
||||
{# Bookmark list #}
|
||||
<section class="content-area column col-8">
|
||||
@ -13,7 +13,7 @@
|
||||
<div class="search">
|
||||
<form action="{% url 'bookmarks:index' %}" method="get">
|
||||
<div class="input-group">
|
||||
<input type="search" name="q" placeholder="Search..." value="{{ query }}">
|
||||
<input type="search" name="q" placeholder="Search for words or #tags" value="{{ query }}">
|
||||
<input type="submit" value="Search" class="btn input-group-btn">
|
||||
</div>
|
||||
</form>
|
||||
@ -29,7 +29,7 @@
|
||||
{% if bookmark.tag_names %}
|
||||
<span>
|
||||
{% for tag_name in bookmark.tag_names %}
|
||||
<a href="?{% append_query_param q=tag_name %}">#{{ tag_name }}</a>
|
||||
<a href="?{% append_query_param q=tag_name|hash_tag %}">{{ tag_name|hash_tag }}</a>
|
||||
{% endfor %}
|
||||
</span>
|
||||
{% endif %}
|
||||
|
@ -5,7 +5,7 @@
|
||||
<p class="group">
|
||||
<span class="group-label mr-2">{{ group.char }}</span>
|
||||
{% for tag in group.tags %}
|
||||
<a href="?{% append_query_param q=tag.name %}">
|
||||
<a href="?{% append_query_param q=tag.name|hash_tag %}">
|
||||
<span class="mr-2">{{ tag.name }}</span>
|
||||
</a>
|
||||
{% endfor %}
|
||||
|
@ -28,3 +28,8 @@ def append_query_param(context, **kwargs):
|
||||
query.__setitem__(key, value)
|
||||
|
||||
return query.urlencode()
|
||||
|
||||
|
||||
@register.filter(name='hash_tag')
|
||||
def hash_tag(tag_name):
|
||||
return '#' + tag_name
|
||||
|
Loading…
Reference in New Issue
Block a user