这是urls.py我Django项目主站点的www.example.com文件。我有一个类别表和一个国家表链接到产品表,但我不能让下面代码中的所有url都工作。如果我把category_detail url放在slug:category_slug〉/slug:slug/',product_detail url之后,这些url工作,而country_detail链接不工作。如果我把country_detail url放在slug:category_slug〉/slug:slug/',product_detail url之后,那么只有country_detail url工作。感谢任何帮助
from django.contrib import admin
from django.urls import path
from core.views import frontpage
from store.views import product_detail, category_detail,country_detail
urlpatterns = [
path('', frontpage, name='frontpage'),
path('admin/', admin.site.urls),
path('<slug:category_slug>/<slug:slug>/', product_detail, name='product_detail'),
path('<slug:slug>/', country_detail, name='country_detail'),
path('<slug:slug>/', category_detail, name='category_detail'),```
2条答案
按热度按时间oprakyz71#
如果我把category_detail网址放在slug:category_slug〉/slug:slug/',product_detail网址之后,那么这些网址有效,而country_detail链接无效;如果我把country_detail网址放在slug:category_slug〉/slug:slug/',product_detail网址之后,那么只有country_detail网址有效。
这是因为Django会使用第一个匹配的路径,因为匹配国家和产品的规则是完全相同的,所以先匹配的就是匹配的。
要解决这个问题,您需要重新考虑API设计,并创建可以明确匹配的路由。
通常我们围绕“资源”和“集合”设计API,这意味着我们将有一个路由
/products/
,例如与集合交互,/products/1
与特定的产品资源交互。对于收集路径
/products
,我们可以添加传入查询参数的功能,以便使用类似/products?country=United+States
的内容对类别或国家进行筛选(注意+
是空间的URL编码版本)要在API端实现这一点,您需要从请求对象中获取查询参数,然后向查询集中添加一个过滤器,这里我不详细介绍,但你可以在谷歌上找到更多信息。对于资源路由
products/1
,我们可能需要获取相关的对象,比如那个国家的类别,在这种情况下,我们将创建一个类似products/1/categories
的路由,我将把实现视图的细节留给读者作为练习。sigwle7e2#
试试这个