繁体   English   中英

Django 使用相同结尾的网址

[英]Django use urls with same ending

我有一个带有应用程序web-api和以下 url 配置的 django 项目:

主项目urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('web-api/', include('webapi.urls')),
]

应用程序web-api/urls.py

urlpatterns = [
    path('<param1:param1>/summary', Param1Summary.as_view()),
    path('<param1:param1>/item/<int:id>/summary', ItemView.as_view()),
]

/web-api/param1/summary端点有效,但/web-api/param1/item/12121/summary无效并返回 404 状态代码。

如果我将<param1:param1>/item/<int:id>/summary'更改为<param1:param1>/item/<int:id>/whatever ,在web-api/url.py我得到了所需的结果。

我尝试使用 url 正则表达式但没有成功。

关于如何解决问题的任何想法?

提前致谢!

不是一般的答案,但在我的情况下有效。

更改网址的顺序解决了这个问题。 web-api/urls.py中的 url 必须按以下顺序排列:

urlpatterns = [
    path('<str:param1>/item/<int:pk>/summary', ItemView.as_view()),
    path('<str:param1>/summary', Param1Summary.as_view()),
]

我不确定,但您可以通过这种方式重新排序网址并添加名称空间,以便您可以从 html 模板或其他视图中调用它们:

urlpatterns = [
    path('summary/<param1:param1>', Param1Summary.as_view(), name='summary_parm')
    path('summary/<param1:param1>/item/<int:id>', ItemView.as_view(),  name='summary_item'),
]

像这样更新您的应用程序 web-api 的urls.py

urlpatterns = [
    path('<param1:param1>/item/<int:id>/summary', ItemView.as_view()),
    path('<param1:param1>/summary', Param1Summary.as_view()),
]

只需交换它们的顺序,这就可以了。

首先,“param1”不是有效的 url 参数类型( 请参阅文档),因此您可能想使用'<str:param1>/summary''<str:param1>/item/<int:pk>/summary' .

其次,您应该将 url 变量命名为“pk”,如django 文档中所述,而不是“id”。

它查找 URLConf 中声明的 pk 和 slug 关键字 arguments,并从视图上提供的 model 属性或查询集属性向上查找 object

它应该如下所示:

urlpatterns = [
    path('<str:param1>/summary', Param1Summary.as_view()),
    path('<str:param1>/item/<int:pk>/summary', ItemView.as_view()),
]

或者,您可以在视图上设置pk_url_kwarg = "id"以让get_object()方法知道如何查询 object。 在文档中查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM