我有这条路线:
url(r'^profile/(?P<user_id>\d+)/?(.+)$', Profile.as_view())
问题是,当我转到/profile/12345
最后一位时,在传递给处理程序时会被截断。所以我明白了user_id=1234
。但是,如果我像我期望的那样去/profile/12345/
或 /profile/12345/user_name then
user_id=12345`。有谁知道为什么我的最后一个数字被切断了?
您的正则表达式实际上正在捕获 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 中的设置)。
另见:
希望有帮助。
最后一位数字被.+
模式捕获。如果您切换到.*
:
>>> 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的答案。我不知道你在做什么是一个好的做法。我可能会将其拆分为指向同一视图的两种不同模式。