Django中的分层URL

时间:2014-05-15 02:16:28

标签: django

有没有办法在Django中实现分层查询模式?据我所知,框架只允许通过解析特定格式的URL来路由到视图,如:

/customers/{order} -> customer.views.show_orders(order)

但如果我需要这样的东西怎么办:

/book1/chapter1/section1/paragraph1/note5 -> notes.view.show(note_id)

其中note_id是URL最后一部分的ID,但URL可能包含不同数量的组件:

/book1/chapter1
/book1/chapter1/section1
etc.

每次都会根据深度指向书籍深度的相关部分。这可行吗?

我知道有这个:https://github.com/MrKesn/django-mptt-urls,但我想知道是否还有其他解决方案。这对我来说并不理想。

3 个答案:

答案 0 :(得分:1)

Django URL只是正则表达式,因此最简单的方法是忽略URL的“note”部分之前的所有内容。例如:

url(r'^.*/note(?P<note_id>[0-9]+)$', 'notes.view.show'),

然而,这会忽略书,章,段组件。这意味着你的笔记需要整个系统中的唯一ID,而不仅仅是书中。如果你需要捕获任何数量的临时部分,那将会更复杂。

我无法确认它现在可以正常工作,但是在正则表达式中使用非捕获组,您应该能够捕获可选的书和章节,如下所示:

url(r'^(?:book(?P<book_id>[0-9]+)/)?(?:chapter(?P<chapter_id>[0-9]+)/)?note(?P<note_id>[0-9]+)$', 'notes.view.show'),

答案 1 :(得分:0)

使用命名组来完成此任务:https://docs.djangoproject.com/en/dev/topics/http/urls/#named-groups

url(r'^book(?P<book_id>\d+)/chapter(?P<chapter_id>\d+)/section(?P<section_id>\d+)/paragraph(?P<paragraph_id>\d+)/note(?P<note_id>\d+)$', notes.view.show(book_id, chapter_id, section_id, paragraph_id, note_id)

答案 2 :(得分:0)

对于那些真正需要可变深度URL结构并且需要URL严格包含slugs而不是ID的人来说,了解URL的所有组件对于从数据库中检索正确的记录至关重要。然后,我能想到的唯一解决方案是使用:

 url(r'^.*/$', notes.views.show, name='show')

然后解析URL的内容,以便在使用request.path调用在视图中检索URL后获取各个组件。这听起来并不理想,但它是实现它的一种方式。