Django URLs - 如何通过干净的 URLs 传递项目列表?

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

我需要实现一个类似这样的结构:example.com/folder1/folder2/folder3/../view(最后可以有其他东西而不是“view”)

这个结构的深度不得而知,树的深处可能埋着一个文件夹。必须获得这个确切的 URL 模式,即我不能只去 example.com/folder_id

关于如何使用 Django URL 调度程序实现这个的任何想法?

django url django-urls nested-lists
2个回答
5
投票

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
    #...

0
投票

您可以创建自定义路径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)
© www.soinside.com 2019 - 2024. All rights reserved.