【问题标题】:How can I redirect the user to another template after a search?搜索后如何将用户重定向到另一个模板?
【发布时间】:2022-11-21 03:01:21
【问题描述】:

我有一个搜索表单,其中用户搜索的模型显示在搜索表单下方,但我希望它显示在另一个页面中。 我尝试寻找一种方法在搜索完成后将用户重定向到另一个 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)
    ...

看法:

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)

模板:

        <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>

【问题讨论】:

    标签: python django django-views django-templates


    【解决方案1】:

    您可以简单地制作两个视图,一个用于显示表单,另一个用于显示查询集,只需要正确使用 action 属性即可:

    笔记:我自己假设 urlpatterns(因为你还没有分享),希望你能理解。

    网址.py:

    urlpatterns=[
        path("form/", views.form_display, name="form_display"),
        path("some_route/", views.FilterView, name="filter_view")
    ]
    

    意见.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)
    

    主要/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>
    

    主/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编写的,因此您可以将其从FilterView更改为filter_view

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 2016-08-05
      • 2019-08-10
      • 2012-12-26
      • 2020-12-19
      • 2013-03-18
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多