gpt4 book ai didi

python - 按类别内的标题过滤(多对多)

转载 作者:行者123 更新时间:2023-12-01 06:25:09 28 4
gpt4 key购买 nike

我有一个页面,我可以在其中选择项目的类别,然后它会将我带到不同的模板并显示该类别的所有项目。需要做什么,以便我可以通过标题进一步过滤这些结果?

views.py 这是按类别过滤我的项目并将我的项目带到 search.html 模板的函数

def category_view(request, category_id):
item_list = Item.objects.filter(category__pk=category_id)

return render(request, "search.html", {'item_list': item_list})

搜索.html

    <div class="offset-md-1 col-md-2">
<h2>Content Filter</h2> <br>
<form method="GET" action=".">
<div class="form-row">
<div class="form-group col-12">
<div class="input-group">
<input class="form-control py-2 border-right-0 border" type="search" name="q"
placeholder="Brand..">
<span class="input-group-append">
<div class="input-group-text bg-transparent">
<i class="fa fa-search"></i>
</div>
</span>
</div>
</div>
</div>
</div>

下面有一个显示结果的列表

views.py 我尝试这样做,但收到错误“找不到页面(404)”“当前路径,自行车类别/与其中任何一个都不匹配。”

def SearchView(request):
item_list = Item.objects.all()
query = request.GET.get('q')
if query:
item_list = Item.objects.filter(title__icontains=query)

context = {
'item_list': item_list
}
return render(request, "search.html", context)

网址:

urlpatterns = [
path('bikes/', BikeView, name='bikes'),
path('', HomeView, name='home'),
path('search/', SearchView, name='search'),
path('bike-category/<category_id>', category_view, name='category')
]

最佳答案

您的表单操作将带您返回同一页面,但没有 category_id。这会给你一个 404 错误,因为你没有为 'bike-category/' 定义 url 路径。您需要将操作设置为 'search/',或者更好的是使用 url 模板标记和路径名称,如下所示:

<form method="GET" action="{% url 'search' %}">

这应该可以解决 404 错误,因为表单应该提交到 'search/',并且 Django 会将请求传递给您的 SearchView 类。

如果您只想在某个类别内搜索,则需要告诉 SearchView 是哪个类别。您可以通过多种方式执行此操作,但由于您已经从类别 View 运行此搜索,最简单的方法可能是创建一个新的 url 以在类别中进行搜索,但使用相同的 View :

urlpatterns = [
path('bikes/', BikeView, name='bikes'),
path('', HomeView, name='home'),
path('search/', SearchView, name='search'),
path('search/<category_id>', SearchView, name='category_search'),
path('bike-category/<category_id>', category_view, name='category')
]

然后您可以修改您的 View 以接受这一点:

def SearchView(request, category_id=None):
if category_id:
category = Category.objects.get(id=category_id)
item_list = Item.objects.filter(category__id=category_id)
else:
category = None
item_list = Item.objects.all()
query = request.GET.get('q')
if query:
item_list = item_list.filter(title__icontains=query)

context = {
'item_list': item_list,
'category': category
}
return render(request, "search.html", context)

请注意,我们将 category_id 作为参数,但为其指定默认值 None,因此非类别搜索仍然有效。然后,如果传入了该类别,我们首先过滤到该类别。最后,我们通过过滤 item_list 而不是 Item.objects,将查询添加到我们的类别过滤器中。

我们还需要更新表单操作以使用此新路径:

<form method="GET" action="{% url 'category_search' category.id %}">

最后我们需要将类别传递给上下文数据中的 search.html 模板:

def category_view(request, category_id):
category = Category.objects.get(pk=category_id)
item_list = Item.objects.filter(category__pk=category_id)

return render(request, "search.html", {'item_list': item_list, 'category': category})

关于python - 按类别内的标题过滤(多对多),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60192627/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com