我的项目中的大多数视图都接受可选的用户名参数,如果存在,则过滤传递给该用户的模板的查询集。所以,例如:
索引视图处理以下网址模式:
'^$' # general index page
'^(?P<username>[-\w]+)/$' # index page for the user
'^photos/$' # photo index page
'^(?P<username>[-\w]+)/photos/$' # photos for that user
...
由于存在许多此类应用程序,因此通过复制模式来实现相同的逻辑似乎并不严重。我认为可以递归地包含主urls.py模块,所以我这样做了:
url(r'^(?P<username>[-\w]+)/', include('urls')),
我的理由是,当包含其他网址模块时,匹配的模式将从路径中删除。所以,我希望
'^(?P<username>[-\w]+)/photos/$'
会变成
'^photos/$'
当它与递归包含的urls模块匹配时,使用额外的username参数。但这导致开发服务器在发出请求时无声地死亡。
我能想到的第二种方法是编写一个中间件,它与url中的模式匹配(如果存在),并将查看的用户添加到请求中,并从请求路径中删除与用户名匹配的部分。但我不想惹这条路,因为这可能会产生不可预测的结果。
你会推荐什么?我对DRYness太挑剔了吗?
谢谢, OMAT
答案 0 :(得分:1)
只需将正则表达式定义为同一文件中的字符串,并使用字符串连接!
user_regex = r"^(?P<username>[-\w]+)/"
然后你可以做正则表达式'%s/photos$'%user_regex
,这样你就可以只保留一次正则表达式,非常干燥。
Altho',您在url标记中包含urls.py模式的原因是正确的,我不确定它为什么会失败。也许是其他一些错误?