【问题标题】:How to include part of the url patterns from an Django app如何包含来自 Django 应用程序的部分 url 模式
【发布时间】:2021-05-15 15:05:08
【问题描述】:

我有两个带有 URL 的 django 应用程序

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 as 中,这将不起作用

urlpatterns = [
   path('', include('app1.urls'),
   path('', include('app2.urls'),
]

因为url2/ 将首先匹配&lt;slug:username&gt;/ 并触发未知用户名错误。

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

  1. 使用非slug url2,例如~url2。这意味着app2 中的所有urls 都必须以~^ 之类的开头。

  2. 在主控 urlpatterns 中重新定义一些 URL,但是我必须从应用程序中导入 views 并从应用程序 urlpattern 中删除 URL。

  3. 使用正则表达式从&lt;slug:username&gt; 中明确排除某些名称。这可能有效,但app2 urlpatterns 中的任何更改都需要反映在app1&lt;slug:username&gt; ... exclude certain names 中。

可以做类似的事情

urlpatterns = [
   path('', include('app1.urls'), # non-user part
   path('', include('app2.urls'), # non-user part
   path('', include('app1.urls'), # user part
   path('', include('app2.urls'), # user part
]

以便在&lt;slug:username&gt;之前匹配固定名称的URL?

【问题讨论】:

    标签: django include-path url-pattern


    【解决方案1】:

    来自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/', <YourViewName>)], 'app2'))),
        path('', include(([path('<slug:username>/', <YourViewName>)], 'app1'))),
        path('', include(([path('<slug:username>/action2/', < YourViewName >)], 'app2'))),
    ]
    

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

    【讨论】:

    • 这似乎不起作用..即使不拆分我的视图,只需在我现有的 app1 之前插入 `path('', include(([], 'app1')))` URL 导致 app1 中的 url 停止工作。看来命名空间需要是唯一的。
    猜你喜欢
    • 2011-06-02
    • 2013-10-01
    • 2011-03-10
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2015-07-01
    相关资源
    最近更新 更多