我正在开发一个 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 中的
include()
函数在匹配结束的位置分割 URL 字符串,并将字符串的剩余部分传递到包含的 URLconf 进行进一步处理。当请求传入时,Django 从 ROOT_URLCONF
的顶部开始,沿着模式列表向下移动,在第一个匹配的处停止。 include()
函数会截断 URL 中与该点匹配的任何部分,并将剩余的字符串发送到包含的 URLconf。
就您而言,
re_path(r'^SUBDIR1/.*$(?i)', include('subdir1.urls'))
中有一个正则表达式模式,它匹配任何以“SUBDIR1/”开头的URL,然后是任意数量的字符,然后交给subdir1.urls
。
发生的事情是这样的:
re_path(r'^SUBDIR1/.*$(?i)', include('subdir1.urls'))
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')
]
如果您仍然遇到此问题,您可能需要检查:
my_new_view
在 views.py
中正确定义,并且采用正确的参数。<parameter>
在您的视图函数中正确使用。urls.py
文件顶部导入了必要的模块。