首页 > 解决方案 > 如何包含来自 Django 应用程序的部分 url 模式

问题描述

我有两个带有 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如果我将它们包含在主人中,这将不起作用

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

因为url2/会首先匹配<slug:username>/并触发未知用户名的错误。

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

  1. 使用非蛞蝓url2~url2. 这意味着 all urlsin必须从orapp2之类的东西开始。~^

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

  3. 使用正则表达式从<slug:username>. 这可以工作,但是urlpatterns 中的任何更改app2都需要反映在.app1<slug:username> ... 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
]

这样固定名称的 URL 将在之前匹配<slug:username>

标签: djangoinclude-pathurl-pattern

解决方案


来自Django 文档

包括((模式列表,app_namespace),命名空间=无)

参数:

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

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

您可以使用此方法包含特定的 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.


推荐阅读