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>  >  <a href="{% url 'index' category_slug=product.category.slug %}">{{ product.category.name }}</a>  >  <a href="{% url 'product' product_slug=product.slug %}">{{ product.name }}</a> </div>
有应用命名空间的模板代码(推荐)
<div class="PD-local"> <a href="/">Главная</a>  >  <a href="{% url 'catalog:index' category_slug=product.category.slug %}">{{ product.category.name }}</a>  >  <a href="{% url 'catalog:product' product_slug=product.slug %}">{{ product.name }}</a> </div>
核心原理
- 路由匹配顺序:Django从上到下匹配URL,具体路由必须优先于通用路由,避免被拦截。
{% url %}标签:通过路由名称动态生成URL,彻底避免硬编码路径的错误,即使后续调整路由前缀(比如主URL添加/catalog/前缀),也能自动生成正确路径。
内容的提问来源于stack exchange,提问作者h1gfun4
相关产品推荐
相关产品推荐

