Django - 当 re_path 找到匹配项但将其交给“include”d urls.py 文件时会发生什么?

问题描述 投票:0回答:1

我正在开发一个 Django 网站,但对 Django 和 Python 还很陌生。

我有一种情况,有一个“更高级别”的

urls.py
文件,使用
re_path
对子目录进行正则表达式匹配,然后
include
将每个子目录传递到其自己的
urls.py
文件。像这样的东西:

urlpatterns = [
    re_path(r'^SUBDIR1/.*$(?i)', include('subdir1.urls'),
    re_path(r'^SUBDIR2/.*$(?i)', include('subdir2.urls'),
    re_path(r'^SUBDIR3/.*$(?i)', include('subdir3.urls')
]

然后每个子目录的

urls.py
基本上只有一个路径/视图连接:

urlpatterns = [
    path('', views.main_view, name='index')
]

在其中一个中,我尝试设置第二个 URL 以转到不同的视图:

urlpatterns = [
    path('', views.main_view, name='index'),
    path('my_new_view/<parameter>/', views.my_new_view, name='my_new_view')
]

但我似乎无法调用我的视图,每次我尝试与我的新模式匹配的 URL 时,我都会再次获得主视图。我猜我不太明白当

re_path
找到匹配项并将其交给包含的
urls.py
文件时会发生什么。我知道正则表达式基本上是在说“匹配子目录名称、正斜杠,然后是任意数量的字符”,但是“匹配”字符串会发生什么情况呢?完整匹配是否会传递到
include
文件进行进一步处理,或者正则表达式是否会吞掉匹配并像空字符串或 null 或其他内容一样传递到
include
文件?

如何让正则表达式匹配子目录模式,同时将足够的信息传递给第二个

urls.py
文件以便触发我的新视图?

django django-urls
1个回答
0
投票

Django 中的

include()
函数在匹配结束的位置分割 URL 字符串,并将字符串的剩余部分传递到包含的 URLconf 进行进一步处理。当请求传入时,Django 从
ROOT_URLCONF
的顶部开始,沿着模式列表向下移动,在第一个匹配的处停止。
include()
函数会截断 URL 中与该点匹配的任何部分,并将剩余的字符串发送到包含的 URLconf。

就您而言,

re_path(r'^SUBDIR1/.*$(?i)', include('subdir1.urls'))
中有一个正则表达式模式,它匹配任何以“SUBDIR1/”开头的URL,然后是任意数量的字符,然后交给
subdir1.urls

发生的事情是这样的:

  1. 收到请求,假设“SUBDIR1/my_new_view/123/”
  2. Django 从根 URLconf 的顶部开始并找到第一个匹配项:
    re_path(r'^SUBDIR1/.*$(?i)', include('subdir1.urls'))
  3. Django 截掉 URL 中与“SUBDIR1/”匹配的部分,因此剩下的字符串是“my_new_view/123/”
  4. 剩余的字符串将传递给
    subdir1.urls
    进行进一步处理。

因此,您面临的问题可能与

re_path
切换无关,而是与您如何在子目录的 urls.py 中定义 URL 相关。

您的

subdir1.urls
文件应如下所示:

urlpatterns = [
    path('', views.main_view, name='index'),
    path('my_new_view/<parameter>/', views.my_new_view, name='my_new_view')
]

如果您仍然遇到此问题,您可能需要检查:

  1. 您的视图函数
    my_new_view
    views.py
    中正确定义,并且采用正确的参数。
  2. URL 模式中的
    <parameter>
    在您的视图函数中正确使用。
  3. 确保您已在
    urls.py
    文件顶部导入了必要的模块。
© www.soinside.com 2019 - 2024. All rights reserved.