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

Django urls.py配置问题:如何在模板中生成非当前路径URL

问题解决步骤

1. 修复URL路由顺序问题

你的urls.py存在路由匹配优先级错误:通用的<slug:category_slug>/路由会先匹配product这类字符串,导致product/<slug:product_slug>/永远无法被命中。需要把具体路由放在通用路由前面,修改后的代码:

urlpatterns = [
    path('search/', views.catalog, name='search'),
    # 把product相关路由移到通用路由前
    path('product/<slug:product_slug>/', views.product, name='product'),
    path('product/model/<slug:model_slug>/', views.model, name='model'),  # 补全末尾斜杠保持格式统一
    path('<slug:category_slug>/', views.catalog, name='index'),
]

如果这些路由属于catalog应用,建议加上应用命名空间(避免多应用路由名冲突):

app_name = 'catalog'

urlpatterns = [
    path('search/', views.catalog, name='search'),
    path('product/<slug:product_slug>/', views.product, name='product'),
    path('product/model/<slug:model_slug>/', views.model, name='model'),
    path('<slug:category_slug>/', views.catalog, name='index'),
]

2. 修改模板中的URL生成方式

不要直接用slug作为href值(会生成错误的相对路径),改用Django的{% url %}模板标签,通过路由的name参数生成正确URL:

无应用命名空间的模板代码

<div class="PD-local">
    <a href="/">Главная</a>
    &emsp;&gt;&emsp;
    <a href="{% url 'index' category_slug=product.category.slug %}">{{ product.category.name }}</a>
    &emsp;&gt;&emsp;
    <a href="{% url 'product' product_slug=product.slug %}">{{ product.name }}</a>
</div>

有应用命名空间的模板代码(推荐)

<div class="PD-local">
    <a href="/">Главная</a>
    &emsp;&gt;&emsp;
    <a href="{% url 'catalog:index' category_slug=product.category.slug %}">{{ product.category.name }}</a>
    &emsp;&gt;&emsp;
    <a href="{% url 'catalog:product' product_slug=product.slug %}">{{ product.name }}</a>
</div>

核心原理

  • 路由匹配顺序:Django从上到下匹配URL,具体路由必须优先于通用路由,避免被拦截。
  • {% url %}标签:通过路由名称动态生成URL,彻底避免硬编码路径的错误,即使后续调整路由前缀(比如主URL添加/catalog/前缀),也能自动生成正确路径。

内容的提问来源于stack exchange,提问作者h1gfun4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:52:38