2013-01-17 161 views
1

为什么会返回NoReverseMatch错误?NoReverseMatch参数django

视图:

def browse(request): 
    thing_list = Thing.objects.all() 
    if request.method == 'POST': 
     form = BrowseForm(request.POST) 
     if form.is_valid(): 
      make = Make.objects.all() 
      return HttpResponseRedirect(reverse('browse_makes', args=[make])) 
    else: 
     form = BrowseForm() 
    return render(request, 'browse.html', {'form':form, 'thing_list':thing_list}) 

def makes(request, make): 
    ad_list = Thing.objects.filter(make=make) 
    return render(request, 'browse-makes.html', {'thing_list':thing_list}) 

网址:

url(r'^browse/$', 'axlepost.views.browse.browse', name='browse'), 
url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse.makes', name='browse_makes'), 

形式:

class BrowseForm(forms.Form): 
    make = forms.ModelChoiceField(queryset=Make.objects.all()) 

模型:

class Make(models.Model): 
    make = models.CharField(max_length=20) 

class Thing(models.Model): 
    make = models.ForeignKey(Make) 

ř eturns Reverse for 'browse_makes' with arguments '([<Make: Samsung>],)' and keyword arguments '{}' not found. 感谢您的想法如何解决这个错误!

+0

请检查您的urls.py的第二行应该是“axlepost.views。使'然后检查出来。 – Prateek

回答

2

你递过reverse() QuerySet而不是1值。也是它的一个.all()查询,所以它可能有多个对象,它与表单结果无关。

make = Make.objects.all() # QuerySet = ([<Make: Samsung>], [<Make: Sony>], [<Make: Apple>], etc) 
return HttpResponseRedirect(reverse('browse_makes', args=[make])) # Expects 1 value 

假设你想重定向到在表单中选择,那么你就需要这样的东西的Make

if form.is_valid(): 
    # Get the valid form data 
    cd = form.cleaned_data 

    # Get the selected Make 
    make = cd.get('make') 

    # Redirect - note 'make.make'. You want to pass the value not the object 
    return HttpResponseRedirect(reverse('browse_makes', kwargs={'make': make.make})) 
+0

谢谢。但应该'清空数据'而不是'clean_data'。谢谢! –

+0

所以它应该:-),更新。很高兴它对你有效。 – rockingskier

0

我认为有几个问题

  • 您的网址不符合相应的视图

改变这一行

url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse.makes', name='browse_makes'), 

url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse', name='browse_makes'), 
  • 更改您的视图定义采取make参数

    高清浏览(请求,使): ... #change局部变量 '让' 给别的

+0

感谢您的回复,但林不知道这会解决我的问题。我在上面添加了更多信息。我试图用不同的'make'选项来下拉浏览表单,然后当用户选择一个make时,它会重定向到'browse_make'。那有意义吗? –

+0

@NickB,你的views文件是views.py和view函数('make')。然后,您需要将''axlepost.views.browse.makes''更改为''axlepost.views.makes''。 – Rohan