Как я могу перенаправить пользователя на другой шаблон после поиска?
У меня есть форма поиска, где модели, которые ищет пользователь, отображаются ниже формы поиска, но я хочу, чтобы они отображались на другой странице. Я пытался найти способ перенаправить пользователя на другой url после завершения поиска и отобразить отфильтрованные данные там, но мне не удалось этого сделать.
модель:
class Product(models.Model):
author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
title = models.CharField(max_length=120, unique=True)
date_posted = models.DateTimeField(default=timezone.now)
...
view:
def FilterView(request):
qs = Product.objects.all()
title_contains_query = request.GET.get('title_contains')
title_or_author_query = request.GET.get('title_or_author')
...
if is_valid_queryparam(title_contains_query):
qs = qs.filter(title__icontains=title_contains_query)
elif is_valid_queryparam(title_or_author_query):
qs = qs.filter(Q(title__icontains=title_or_author_query) | Q(author__username__icontains=title_or_author_query)).distinct()
...
context = {
'queryset': qs,
...
}
return render(request, 'main/form.html', context)
template:
<form method="GET">
<div>
<input type="search" name="title_contains" placeholder="Title contains">
<span><div><i class="fa fa-search"></i></div></span>
</div>
<div>
<input type="search" name="title_or_author" placeholder="Title or author">
<span>
<div><i class="fa fa-search"></i></div>
</span>
</div>
...
<button type="submit">Search</button>
</form>
<div>
<ul>
{% for product in queryset %}
<li>
{{ product.title }}
<span>Author: {{ product.author.name }}</span>
</li>
<hr />
{% endfor %}
</ul>
</div>
Вы можете просто сделать два представления одно для отображения формы, а другое для отображения набора запросов, только нужно правильно использовать атрибут action
так:
Примечание: Предполагая urlpatterns самостоятельно (поскольку вы не поделились), надеюсь, вы поймете.
urls.py:
urlpatterns=[
path("form/", views.form_display, name="form_display"),
path("some_route/", views.FilterView, name="filter_view")
]
views.py:
def form_display(request):
return render("main/form.html")
def FilterView(request):
qs = Product.objects.all()
title_contains_query = request.GET.get('title_contains')
title_or_author_query = request.GET.get('title_or_author')
...
if is_valid_queryparam(title_contains_query):
qs = qs.filter(title__icontains=title_contains_query)
elif is_valid_queryparam(title_or_author_query):
qs = qs.filter(Q(title__icontains=title_or_author_query) | Q(author__username__icontains=title_or_author_query)).distinct()
...
context = {
'queryset': qs,
...
}
return render(request, 'main/display_query.html', context)
main/form.html:
<form method="GET" action="{% url 'filter_view' %}">
<div>
<input type="search" name="title_contains" placeholder="Title contains">
<span><div><i class="fa fa-search"></i></div></span>
</div>
<div>
<input type="search" name="title_or_author" placeholder="Title or author">
<span> <div><i class="fa fa-search"></i></div> </span>
</div>
...
<button type="submit">Search</button>
</form>
main/display_query.html:
<div>
<ul>
{% for product in queryset %}
<li>
{{ product.title }}
<span>Author: {{ product.author.name }}</span>
</li>
<hr/>
{% endfor %}
</ul>
</div>
Примечание: Представления на основе функций записываются в
snake_case
, а не вPascalCase
, в отличие от представлений на основе классов, поэтому вы можете изменить его наfilter_view
изFilterView
.