URL-адреса Django - Как передать список элементов через чистые URL-адреса? - PullRequest
5 голосов
/ 02 марта 2010

Мне нужно реализовать структуру, подобную этой: example.com / folder1 / folder2 / folder3 /../ view (в конце могут быть другие вещи вместо «view»)

Глубина этой структуры неизвестна, и в глубине дерева может быть скрыта папка. Очень важно получить этот точный шаблон URL, то есть я не могу просто перейти на example.com / folder_id

Есть идеи, как это реализовать с помощью диспетчера URL Django?

1 Ответ

5 голосов
/ 02 марта 2010

Диспетчер URL-адресов Django основан на регулярных выражениях, поэтому вы можете предоставить ему регулярное выражение, которое будет соответствовать желаемому пути (с повторяющимися группами). Однако я не смог найти способ сделать так, чтобы диспетчер URL django совпадал с несколькими подгруппами (он возвращает только последнее совпадение в качестве параметра), поэтому некоторая часть обработки параметров оставлена ​​для просмотра.

Вот пример шаблона URL:

urlpatterns = patterns('',
    #...
    (r'^(?P<foldersPath>(?:\w+/)+)(?P<action>\w+)', 'views.folder'),
)

В первом параметре у нас есть группа без захвата для повторения символов «слова», за которыми следует «/». Возможно, вы захотите изменить \ 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
    #...
...