如何包含来自 Django 应用程序的部分 url 模式

问题描述

我有两个带有 URL 的 Django 应用

controller

app_name = 'app1'
urlpatterns = [
  path('url1/',...,name='name1')
  path('<slug:username>/',name='name2')
]

如果我将它们包含在主 app_name = 'app2' urlpatterns = [ path('url2/',name='name3') path('<slug:username>/action2/',name='name4') ] 中,这将不起作用

urlpatterns

因为 urlpatterns = [ path('',include('app1.urls'),path('',include('app2.urls'),] 会首先匹配 url2/ 并触发未知用户名错误

有一些潜在的解决方案,但没有一个对我来说效果很好:

  1. 使用非 slug <slug:username>/,例如 url2。这意味着 ~url2 中的所有 urls 都必须以 app2~ 之类的内容开头。

  2. 在主 ^ 中重新定义一些网址,但随后我将不得不从应用程序中导入 urlpatterns 并从应用程序 views删除网址。

  3. 使用正则表达式从 urlpattern 中明确排除某些名称。这可以工作,但 <slug:username> urlpatterns 中的任何更改都需要反映在 app2app1 中。

可以做类似的事情

<slug:username> ... exclude certain names

这样固定名称的 URL 将在 urlpatterns = [ path('',# non-user part path('',# user part path('',# user part ] 之前匹配?

解决方法

来自Django docs

include((pattern_list,app_namespace),namespace=None)

参数:

pattern_list – 可迭代的 path() 和/或 re_path() 实例。

app_namespace (str) – URL 条目的应用程序命名空间 包括

您可以使用此方法包含特定网址:

urlpatterns = [
    path('',include(([path('url1/',<YourViewName>)],'app1'))),path('',include(([path('url2/','app2'))),include(([path('<slug:username>/',include(([path('<slug:username>/action2/',< YourViewName >)],]

include 中元组的第一个元素是您要包含的 path/re_path 实例列表,第二个元素是 app name