有问题的网址格式是:
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),
感谢您的帮助!
答案 0 :(得分:2)
business_list
是一个函数,它接受一个名为&#34; param&#34;的请求和参数。 (应该给它一个更好的名称,使它不那么通用)。在Django中,URL路由可以定义将哪些值传递给视图函数的参数。
在上面的情况中,当用户转到/Miami
时,Django将尝试将字符串"Miami"
与URL路由中定义的任何正则表达式进行匹配。在这种情况下,匹配表达式为^(?P<param>\w+)$
。完成此匹配后,字符串Miami
将被捕获到param
。
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)