Я хочу найти имя пользователя в базе данных и перечислить все результаты поиска на другой странице. На этой странице, к перечисленным результатам, я хочу применить некоторую фильтрацию. Это звучит как простая вещь, но я испытываю трудности. Я использую django -фильтры.
в доме . html У меня есть поиск
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<form action = {% url 'users:index' %} method="get">
{% csrf_token %}
<div class="d-flex justify-content-center">
<div>
<input class="form-control" type="text" name="search"
placeholder="Search a user...">
</div>
<div>
<button class="btn btn-dark" type="submit" name="action">Search</button>
</div>
</div>
</form>
</body>
</html>
Результаты перечислены в индексе . html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Users App</title>
</head>
<body>
<form method="GET">
{{ filter.form }}
<button type="submit" >Search</button>
</form>
{% if filter.qs %}
<ul>
{% for user in filter.qs %}
<li><a href="{% url 'users:detail' user.id %}">{{ user.name }}, {{ user.nationality }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No users available.</p>
{% endif %}
</body>
</html>
Теперь, если я попытаюсь применить фильтр от filter.form, я получаю ошибку Невозможно использовать None в качестве значения запроса. Вот views.py :
# Create your views here.
def home(request):
return render(request, 'users/home.html')
class UserListView(ListView):
model = User
template_name = 'users/index.html'
# queryset = User.objects.filter(name__icontains='Bruno') same as
def get_queryset(self): # new
query = self.request.GET.get('search')
return User.objects.filter(name__icontains=query)
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['filter'] = UserFilter(self.request.GET, queryset=self.get_queryset())
return context
urls.py
app_name = 'users'
urlpatterns = [
path('home/', views.home, name='home'),
path('', views.UserListView.as_view(), name='index'),
path('<int:user_id>/', views.detail, name='detail'),
]
filters.py
import django_filters as filters
from .models import User
class UserFilter(filters.FilterSet):
class Meta:
model = User
fields = ('name', 'surname',)
проблема заключается в том, что после поиска, отправленного методом POST, при повторном использовании представления UserListView команда self.request.GET.get('search')
возвращает пустой объект.
Как мне отфильтровать результаты поиска? Есть ли способ сохранить поисковый запрос, чтобы фильтр применялся только к найденным элементам?