I’m trying to filter ListView
based on post method from search bar in my base
template. So making it works like:
JavaScript
x
2
1
Insert name --> SearchBar-->GET Method-->SearchView class(in views.py)--> render html with usernames.
2
I have done this, but it wont work. Could you please tell me what I’m doing wrong?
views.py in my user app
JavaScript
1
15
15
1
class SearchView(ListView):
2
model = User
3
template_name = 'blog/list_of_users.html'
4
context_object_name = 'all_search_results'
5
6
def get_queryset(self):
7
result = super(SearchView, self).get_queryset()
8
query = self.request.GET.get('search')
9
if query:
10
postresult = User.objects.filter(username__contains=query)
11
result = postresult
12
else:
13
result = None
14
return result
15
urls.py in my blog
app
JavaScript
1
2
1
path('users_search/?search=<str:username>', user_view.SearchView.as_view(), name='user_search'),
2
search form in html
JavaScript
1
6
1
<form class="example" method="GET">
2
<input type="search" placeholder="ユーザー検索..." name="user_name">
3
<button type="submit">
4
検索
5
</button>
6
rendered html with user names
JavaScript
1
6
1
{% for result in all_search_results %}
2
{{ result.username }}
3
{% empty %}
4
add something to show no results
5
{% endfor %}
6
Advertisement
Answer
override get_context_data
method
JavaScript
1
6
1
def get_context_data(self, **kwargs):
2
context = super().get_context_data(**kwargs)
3
user_name = self.request.GET.get('user_name', '')
4
context['all_search_results'] = User.objects.filter(username__icontains=user_name )
5
return context
6
In your template
JavaScript
1
13
13
1
<form class="example" method="GET">
2
<input type="text" placeholder="ユーザー検索..." name="user_name">
3
<button type="submit">
4
検索
5
</button>
6
</form>
7
8
{% for result in all_search_results %}
9
{{ result.username }}
10
{% empty %}
11
add something to show no results
12
{% endfor %}
13
Update:
in template
, <input ........... name="search">
in views
, user_name = self.request.GET.get('search', '')