1

我有这条路线:

url(r'^profile/(?P<user_id>\d+)/?(.+)$', Profile.as_view())

问题是,当我转到/profile/12345最后一位时,在传递给处理程序时会被截断。所以我明白了user_id=1234。但是,如果我像我期望的那样去/profile/12345/或 /profile/12345/user_name thenuser_id=12345`。有谁知道为什么我的最后一个数字被切断了?

4

2 回答 2

2

您的正则表达式实际上正在捕获 url 的最后一个字符:

>>> import re
>>> re.search("(?P<user_id>\d+)/?(.+)", "/profile/12345").groups()
('1234', '5')
>>> re.search("(?P<user_id>\d+)/?(.+)", "/profile/12345/").groups()
('12345', '/')

请尝试更简单的方法:

url(r'^profile/(?P<user_id>\d+)$', Profile.as_view())

请注意,您实际上不需要/在最后照顾(引用this answer):

在没有正斜杠的 Django URL 中,会自动附加一个正斜杠。这是 Django 开发人员的偏好,而不是网络的硬编码规则(我认为它实际上是 Django 中的设置)。

另见:

希望有帮助。

于 2013-09-07T17:21:32.067 回答
1

最后一位数字被.+模式捕获。如果您切换到.*

>>> a = re.compile('profile/(?P<user_id>\d+)/?(.+)')
>>> s = a.search("/profile/1234")
>>> s.groups()
('123', '4')

>>> a = re.compile('profile/(?P<user_id>\d+)/?(.*)')
>>> s = a.search("/profile/1234")
>>> s.groups()
('1234', '')
>>> s.groupdict()
{'user_id': '1234'}

也请参阅alecxe的答案。我不知道你在做什么是一个好的做法。我可能会将其拆分为指向同一视图的两种不同模式。

于 2013-09-07T17:43:13.743 回答