django 捕获特定名称下的所有 URLS

django catching all URLS under a specific name

我想在 urls.py 下有一个条目,它将捕获 URL 中以特定文件夹开头的所有子文件夹,在本例中为 example

示例:

/business
/business/one
/business/one/two
/business/one/two/three
/business/one/two/three/four

我希望所有这些 URLS 都进入 single view,稍后我可以确定有多少级别/business/ 及其名称之后的文件夹。

您可以使用 <path:…> path converter [Django-doc],但这要求元素非空。

使用re_path

如果您因此想要匹配包含空路径的路径,您可以使用 ([^/]+/)* 正则表达式模式:

from django.urls import re_path

urlpatterns = [
    re_path(r'^business/<b>(?P<path>([^/]+/)*)</b>$', views.myview, name='myview'),
]

然后在视图中拆分路径:

def myview(request, path):
    path_items = <b>path.split('/')</b>

path_items 是路径元素列表。

自定义路径转换器

您还可以注册自定义路径转换器:

# app/converters.py

class EmptyPathConverter:
    <b>regex = '([^/]+/)*'</b>

    def to_python(self, value):
        return value.split('/')

    def to_url(self, value):
        return '/'.join(value)

然后注册路径转换器,定义路径时使用:

from app.converters import EmptyPathConverter
from django.urls import path, register_converter

register_converter(EmptyPathConverter, 'emptypath')

urlpatterns = [
    path('business/<b><emptypath:paths></b>', views.myview, name='myview'),
]

然后我们可以在视图中使用它,它已经为我们做了拆分:

def myview(request, paths):
    # paths is a list of strings
    # …