Как я могу перенаправить пользователя на другой шаблон после поиска?

У меня есть форма поиска, где модели, которые ищет пользователь, отображаются ниже формы поиска, но я хочу, чтобы они отображались на другой странице. Я пытался найти способ перенаправить пользователя на другой 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.

Вернуться на верх