Django URL:无法将关键字arg放入我的视图中?

时间:2013-05-27 14:17:31

标签: django django-views django-urls

有问题的网址格式是:

url(r'^$', business_list, name='business_list_home'),
url(r'^(?P<param>\w+)$', business_list, name='business_list_results'),

我的观点是:

@render_to('app/business_list.html')
def business_list(request, param=None):
    queryset = Business.objects.all()

    search_form = SearchForm
    print request.GET

    if param in request.GET:
        param = request.GET.get('param')
        if queryset.filter(city__iexact=param).exists():
            queryset = queryset.filter(city__iexact=param)
        elif queryset.filter(category__iexact=param).exists():
            queryset = queryset.filter(category__iexact=param)
        print queryset
    else:
        queryset = None
        print queryset

return {'business_list': queryset, 'search_form': search_form}

基本上,我不明白为什么当我去/迈阿密时我在视图中无法通过request.GET['param']访问它? print request.GET打印<QueryDict: {}>

我想要这样做的原因是有一个很好的URL方案,用于显示城市或类别的业务结果(这也是我在视图中检查它是否是城市或类别的原因)。让我知道是否有更好的方法来实现这一点,如

url(r'^$', business_list),
url(r'^(?P<city>\w+)$', business_list),
url(r'^(?P<category>\w+)$', business_list),
url(r'^(?P<category>\w+)/(?P<city>\w+)$', business_list),

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

business_list是一个函数,它接受一个名为&#34; param&#34;的请求和参数。 (应该给它一个更好的名称,使它不那么通用)。在Django中,URL路由可以定义将哪些值传递给视图函数的参数。

在上面的情况中,当用户转到/Miami时,Django将尝试将字符串"Miami"与URL路由中定义的任何正则表达式进行匹配。在这种情况下,匹配表达式为^(?P<param>\w+)$。完成此匹配后,字符串Miami将被捕获到param

然后,Django将调用business_list(request, param="Miami")。请注意,网址中没有传递任何查询参数(例如,/Miami?color=blue)。

您在上面编写的代码中的问题是,您要检查param是否存在,而不是param在查询参数中传递。尝试转到网址/Miami?param=test,它可能会按照您的预期方式运作。

这里真正的解决方法是不引用request.GET,因为使用GET参数正是您要避免的。所以,而不是

if param in request.GET:
    param = request.GET.get('param')
    if queryset.filter(city__iexact=param).exists():
        queryset = queryset.filter(city__iexact=param)
    elif queryset.filter(category__iexact=param).exists():
        queryset = queryset.filter(category__iexact=param)
    print queryset

只是做:

if param:
    if queryset.filter(city__iexact=param).exists():
        queryset = queryset.filter(city__iexact=param)
    elif queryset.filter(category__iexact=param).exists():
        queryset = queryset.filter(category__iexact=param)