NoReverseMatch at / detail /反向''带参数'()'和关键字参数{}未找到

时间:2013-04-05 15:10:30

标签: django parameter-passing reverse

我想在Django中将视图中的参数传递给视图,当我首先传递三个参数时,它可以工作,但是当它超过3个参数不再起作用时。 传递参数时,我有这个错误:

NoReverseMatch at /detail/
Reverse for 'display_filter' with arguments '()' and keyword arguments '{'country': 'USA', 'street': 'Wall Street', 'continent': 'America', 'city': 'new York'}' not found.

urls.py

url(r'^detail/$', 'examples.views.detail'),
url(r'^display_filter/(?P<continent>[-\w]+)/(?P<country>[-\w]+)/(?P<city>[-\w]+)/(?P<street>[-\w]+)/$', 'examples.views.display_filter', name='display_filter'),

views.py

def detail(request):
    continents = Select_continent()
    if request.method == 'POST':  
        continent = request.POST.get('combox1')
        country = request.POST.get('combox2')
        city = request.POST.get('combox3')
        street = request.POST.get('combox4')
        countries =Select_country(continent)
        cities= Select_city(continent,country)
        streets = Select_street(continent,country,city)
        for row in continents :
            if row[0]==int(continent) :
                param1 =row[1]
        for row in countries:
            if row[0]==int(country):
                param2=row[1]    
        for row in cities:
            if row[0]==int(city):
                param3=row[1]
        for row in streets:
            if row[0]==int(street):
                param4=row[1]     
        url = reverse('display_filter', args=(), kwargs={'continent':param1,'country':param2,'city':param3,'street':param4})
        return redirect(url)

    return render(request, 'filter.html', {'items': continents,})

def display_filter(request,continent, country,city, street):

    data = Select_WHERE(continent, country, city,street)
    #symbol = ConvertSymbol(currency)   
    return render_to_response('filter.html', {'data': data, }, RequestContext(request))     

2 个答案:

答案 0 :(得分:1)

看起来这是你的url正则表达式的问题。

你有什么

(?P<city>[-\w])

只匹配1位数,字符,空格,下划线或连字符。你应该拥有的是

(?P<city>[-\w]+)

将与其他人一样匹配1个或更多。


另一件事是你可以尝试改变

url = reverse('display_filter', args=(), kwargs={'continent':param1,'country':param2,'city':param3,'street':param4})
return redirect(url)

return redirect('display_filter', continent=param1, country=param2, city=param3, street=param4)

redirect是一种快捷方式,因此您无需致电reverse,因为它会为您执行此操作。

答案 1 :(得分:0)

我认为你需要做两件事:

  1. 在您的urls.py中添加一个与您的3个参数匹配的网址:

    url(r'^display_filter/(?P[-\w]+)/(?P[-\w]+)/(?P[-\w]+)/$', 'examples.views.display_filter', name='display_filter'),

  2. 您必须在视图方法中为第四个参数设置默认值:

    def display_filter(request, continent, country, city, street=None):

  3. 然后,您可以使用三个参数调用URL。