You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题排查与修复

  1. 调整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'),
    ]
    
  2. 修复视图未定义变量问题
    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})
    
  3. 验证表单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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:50:23