我需要实现一个类似这样的结构:example.com/folder1/folder2/folder3/../view(最后可以有其他东西而不是“view”)
这个结构的深度不得而知,树的深处可能埋着一个文件夹。必须获得这个确切的 URL 模式,即我不能只去 example.com/folder_id
关于如何使用 Django URL 调度程序实现这个的任何想法?
Django 的 url dispatcher 基于正则表达式,所以你可以为它提供一个正则表达式来匹配你想要的路径(带重复组)。 但是,我找不到让django的url dispatcher匹配多个子组的方法(它只返回最后一个匹配作为参数),所以一些参数处理留给视图。
这是一个示例 url 模式:
urlpatterns = patterns('',
#...
(r'^(?P<foldersPath>(?:\w+/)+)(?P<action>\w+)', 'views.folder'),
)
在第一个参数中,我们有一个非捕获组,用于重复“word”字符后跟“/”。也许您想将 \w 更改为其他内容以包含字母表和数字以外的其他字符。
您当然可以在 url 配置中将其更改为多个视图,而不是使用操作参数(如果您的操作集有限,这更有意义):
urlpatterns = patterns('',
#...
(r'^(?P<foldersPath>(?:\w+/)+)view', 'views.folder_View'),
(r'^(?P<foldersPath>(?:\w+/)+)delete', 'views.folder_delete'),
)
在视图中,我们拆分第一个参数以获得文件夹数组:
def folder(request, foldersPath, action):
folders = foldersPath.split("/")[:-1]
print "folders:", folders, "action:", action
#...
您可以创建自定义路径despatcher
创建 converts.py 并进入你可以创建 ListCoverter:
class ListConverter:
# return any combination of '/folder_id1/folder_id2'
regex = '.*\/*'
def to_python(self, folder_list):
l = folder_list.split('/')
l = [int(i) for i in l]
return l
def to_url(self, folder_list):
return folder_list
确保将列表作为参数传递给 view.py 中的 folder_view 和 folder_delete 函数
在 urls.py 中你需要注册这个调度程序:
from django.urls import path, register_converter
from . import views, converts
register_converter(converts.ListConverter, 'folder_id')
path('<folder_id:folder_id>', views.folder_View)