如何在Django URL中用正则表达式提取整数
我尝试用 (?P<id_user>\d+)
从我的网址中提取整数。但是它给我的结果是一个字符串。有没有什么办法解决这个问题?我只需要整数 4
作为我的 id_user。
这是我 urls.py 的一部分:
url(r'^adm/list_users/assign_user_groups/(?P<id_user>\d+)/grant_user_group/(?P<id_group>\d+)/$', views.grant_user_group, name='grant_user_group'),
这是我遇到的错误:
ValueError at /adm/list_users/assign_user_groups/4/grant_user_group/2/
invalid literal for int() with base 10: '4/grant_user_group/2'
补充:
这是我的 urls.py 代码:
from django.conf.urls import patterns, url
from adm import views
urlpatterns = patterns('',
url(r'^adm/list_users/$', views.list_users, name='list_users'),
url(r'^adm/list_users/add_user/$', views.add_user, name='add_user'),
url(r'^adm/list_users/modify_user/(?P<id_user>.*)/$', views.modify_user, name='modify_user'),
url(r'^adm/list_users/delete_user/(?P<id_user>.*)/$', views.delete_user, name='delete_user'),
url(r'^adm/list_users/visualize_user/(?P<id_user>.*)/$', views.visualize_user, name='visualize_user'),
url(r'^adm/list_users/assign_user_groups/(?P<id_user>.*)/$', views.assign_user_groups, name='assign_user_groups'),
url(r'^adm/list_users/assign_user_groups/(?P<id_user>\d+)/grant_user_group/(?P<id_group>\d+)/$', views.grant_user_group, name='grant_user_group'),
#url(r'^adm/list_users/assign_user_groups/(?P<id_user>.*)/deny_user_group/(?P<id_group>.*)/$', views.deny_user_group, name='deny_user_group'),
url(r'^adm/create_group/$', views.create_group, name='create_group'),
url(r'^adm/list_groups/$', views.list_groups, name='list_groups'),
url(r'^adm/list_groups/(?P<id_group>.*)/assign_perm/$', views.assign_permissions, name='assign_perm'),
url(r'^adm/list_groups/(?P<id_group>.*)/grant_perm/(?P<id_perm>.*)$', views.grant_permissions, name='grant_perm'),
url(r'^adm/list_groups/(?P<id_group>.*)/deny_perm/(?P<id_perm>.*)$', views.deny_permissions, name='deny_perm'),
)
1 个回答
1
Django总是使用第一个匹配的模式。对于像/adm/list_users/assign_user_groups/4/grant_user_group/2/
这样的链接,匹配的模式是叫做assign_user_groups
的那个,而grant_user_group
根本没有被用到。
问题出在你在assign_user_groups
中使用了.*
,这个写法不够具体,允许所有字符(包括“/”),这其实不太合理,因为你只想捕捉数字。
你可以把这两个模式的顺序调换一下,但更好的做法是让它们更具体,把所有的.*
改成\d+
。