如何在Django URL中用正则表达式提取整数

0 投票
1 回答
802 浏览
提问于 2025-04-18 04:43

我尝试用 (?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+

撰写回答