0

我项目中的大多数视图都接受可选的用户名参数,如果存在,过滤传递给该用户模板的查询集。因此,例如:

索引视图处理以下两种 url 模式:

'^$' # 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')),

我的理由是,当包含其他 urls 模块时,匹配的模式将从路径中删除。所以,我希望

'^(?P<username>[-\w]+)/photos/$'

会成为

'^photos/$'

当它与递归包含的 urls 模块匹配时,带有额外的用户名参数。但这会导致开发服务器在发出请求时静默死机。

我能想到的第二种方法是编写一个中间件,如果存在,它将匹配url中的模式,并将查看的用户添加到请求中并从请求路径中删除与用户名匹配的部分。但我不想弄乱路径,因为这可能会产生不可预测的结果。

你会推荐什么?我对 DRYness 太挑剔了吗?

谢谢,奥马特

4

1 回答 1

1

只需将正则表达式定义为同一文件中的字符串并使用字符串连接!

user_regex = r"^(?P<username>[-\w]+)/"

然后你可以做正则表达式'%s/photos$'%user_regex,这样你就可以只定义一次正则表达式,非常干。

Altho',您在 url 标签中包含 urls.py 模式的理由是正确的,我不确定它为什么会失败。也许还有其他错误?

于 2010-06-29T08:48:05.640 回答