Django:在单个urls.py中包含其他urlpatterns

时间:2009-07-15 02:11:00

标签: django django-urls

我在myproject.myapp.urls中做了类似的事情:

from django.conf.urls.defaults import *

urlpatterns = patterns('myproject.myapp.views',
    (ur'^$', 'index'),
    (ur'^browse/$', 'browse'),
    (ur'^request/new/$', 'new_request'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/$', 'view1'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/asdf$', 'view2'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/qwer$', 'view3'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/zxcv$', 'view4'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/tyui$', 'view5'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/ghjk$', 'view6'),
    (ur'^(?P<url_key>[-a-zA-Z0-9]+)/bnm/more-looong-url/$', 'view7'),
    ...
)

我尝试重构上述规则,并将其定义在另一个文件urls2.py中,如下所示:

(ur'^(?P<url_key>[-a-zA-Z0-9]+)/', include('myproject.myapp.urls2')),

但它似乎会导致包括urlresolvers在内的单元测试出现问题。

这里有更好的方法来“重构”正则表达式的公共部分(<url_key>)吗?

3 个答案:

答案 0 :(得分:3)

我不是django专家,但是'view1'项不会匹配它下面的所有其他条目,因为它最后没有'$'吗?所以其他观点没有机会匹配。

答案 1 :(得分:1)

我认为你不能做你想用这条线做的事情:

(ur'^(?P<url_key>[-a-zA-Z0-9]+)/', include('myproject.myapp.urls2'))

url_key参数传递给哪个视图?

我不确定你为什么要重新开始urlpatterns,但也许这会更好?:

from django.conf.urls.defaults import *

URL_KEY = ur'^(?P<url_key>[-a-zA-Z0-9]+)'

urlpatterns = patterns('myproject.myapp.views',
    (ur'^$', 'index'),
    (ur'^browse/$', 'browse'),
    (ur'^request/new/$', 'new_request'),
    (URL_KEY+ur'/$', 'view1'),
    (URL_KEY+ur'/asdf$', 'view2'),
    (URL_KEY+ur'/qwer$', 'view3'),
    ...etc
)

答案 2 :(得分:0)

也许您可以简化myproject.myapp.urls中的表达式,而是将信息作为参数传递给myproject.myapp.views中的函数?

我不确定您的测试中出现了什么问题,但一般来说,您将能够在myproject.myapp.views中执行更多操作,因为您不必将其全部基于正则表达式逻辑。

myproject.myapp.views中的该函数将是一个调用view1,view2等的交换机