Django项目搜索功能出现Page not Found错误,求助定位urls.py问题
Django全局搜索报Page not Found错误的排查与修复
我在Django项目里实现全局搜索功能时,一直碰到Page not Found错误,推测问题出在urls.py文件中,但无法准确定位。相关代码如下:
urls.py
from . import views app_name = 'app' urlpatterns = [ path('', views.product_list, name='product_list'), path('<slug:category_slug>/', views.product_list, name='product_list_category'), path('search/', views.search_list, name='search_list'), path('<int:id>/<slug:slug>/', views.product_details, name='product_details'), ]
views.py
from .models import Category, Product from cart.forms import CartAddProductForm from django.db.models import Q # Create your views here. def product_list(request, category_slug=None): category = None categories = Category.objects.all() products = Product.objects.filter(available=True) if category_slug: category = get_object_or_404(Category, slug=category_slug) products = products.filter(category=category) return render(request, 'products/list.html', {'category': category, 'categories': categories, 'products': products}) def product_details(request, id, slug): product = get_object_or_404(Product, id=id, slug=slug, available=True) cart_product_form = CartAddProductForm() return render(request, 'products/detail.html', {'product': product, 'cart_product_form': cart_product_form}) def search_list(request): search_post = request.GET.get('q') search_query = Product.objects.filter(Q(name__icontains=search_post) | Q(category__name__icontains=search_post)) return render(request, 'products/search.html', {'search_post': search_post, 'search_query': search_query, 'category': category, 'categories': categories})
问题排查与修复
调整URL路由顺序
当前category_slug路由在search/前面,访问/search/时,Django会把search当作分类slug去匹配path('<slug:category_slug>/', ...),找不到对应分类就返回404。把精确匹配的search/路由移到前面,确保优先匹配:urlpatterns = [ path('', views.product_list, name='product_list'), path('search/', views.search_list, name='search_list'), # 移至category_slug路由前 path('<slug:category_slug>/', views.product_list, name='product_list_category'), path('<int:id>/<slug:slug>/', views.product_details, name='product_details'), ]修复视图未定义变量问题
search_list视图返回的category和categories变量未定义,会导致500错误,同时补充处理搜索关键词为空的情况:def search_list(request): search_post = request.GET.get('q') categories = Category.objects.all() category = None # 处理关键词为空的情况,避免返回所有商品 if search_post: search_query = Product.objects.filter(Q(name__icontains=search_post) | Q(category__name__icontains=search_post)) else: search_query = Product.objects.none() return render(request, 'products/search.html', {'search_post': search_post, 'search_query': search_query, 'category': category, 'categories': categories})验证表单action路径
确保搜索表单的action正确指向带命名空间的搜索路由:<form action="{% url 'app:search_list' %}" method="get"> <input type="text" name="q" placeholder="搜索商品..."> <button type="submit">搜索</button> </form>
内容的提问来源于stack exchange,提问作者Chidera Ferdinand
相关产品推荐
相关产品推荐

