Django URL 使用查询参数不解析

2 投票
4 回答
2654 浏览
提问于 2025-04-16 02:39

我遇到了一个问题,我需要在GET请求中传递查询参数,但Django没有正确解析URL到视图。

我的urls.py文件是这样的:

   from django.conf.urls.defaults import * 
   urlpatterns = patterns('',
       url(r'^confirm_cancel',
          'myapp.views.confirm_cancel_method',
           name='myapp_confirm_cancel'),
       )

当我访问 /confirm_cancel?some_id=x 时,我收到一个404错误,提示“没有匹配的MyModel。”当我在视图处理程序中设置断点时,访问这个URL时并没有触发断点。

但是,如果我访问 /confirm_cancel/x/,我的视图断点就会被触发。

还有一点需要注意,这在Django 1.1中是可以正常工作的,但自从我升级到1.2后就出现了问题。

有什么想法吗?

谢谢!

4 个回答

1

我们需要看看对应的视图函数里面有什么。

理想情况下,它应该像这样:

def confirm_cancel_method(request, some_id=None):
    some_id = request.REQUEST.get('some_id', some_id)
    some_record = get_object_or_404(SomeModel, pk=some_id)
    ...

更新

抱歉,刚看到你提到的断点。我要推荐的一件事是把配置改成这样:

from django.conf.urls.defaults import * 
urlpatterns = patterns('',
    url(r'^confirm_cancel/?$',
       'myapp.views.confirm_cancel_method',
        name='myapp_confirm_cancel'),
    )

在末尾加上 /?$ 的意思是只有 /confirm_cancel/confirm_cancel/ 这两个地址会匹配到这个网址。现在因为你没有加上结尾的 $,所以任何以 confirm_cancel 开头的地址都会匹配。修正这个模式至少能解决这个问题。

1

我觉得你遇到的问题可能不是出在你的网址上。你在视图里有没有用到像 get_object_or_404 这样的快捷方式?比如说:

get_object_or_404(MyModel, pk=99)

如果你的表里没有主键为99的记录,这样就会出现“没有找到符合条件的MyModel”的提示。

1

我在我的帖子里把urls.py中的所有网址模式都复制出来了。

结果发现问题出在我在urlpatterns最上面有一行r'^(?P<my_id>\w+)/?$'的代码。

下次我会学着把所有的代码都粘贴上去,而不是只挑我认为有问题的那几行。

奇怪的是,这并没有导致Django 1.1崩溃……我想这应该是个在1.2版本中修复的bug。

撰写回答