Reputation: 9289
Why does this return a NoReverseMatch error?
view:
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:
url(r'^browse/$', 'axlepost.views.browse.browse', name='browse'),
url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse.makes', name='browse_makes'),
form:
class BrowseForm(forms.Form):
make = forms.ModelChoiceField(queryset=Make.objects.all())
model:
class Make(models.Model):
make = models.CharField(max_length=20)
class Thing(models.Model):
make = models.ForeignKey(Make)
Returns Reverse for 'browse_makes' with arguments '([<Make: Samsung>],)' and keyword arguments '{}' not found.
Thanks for your ideas on how to solve this error!
Upvotes: 1
Views: 217
Reputation: 9346
You are handing reverse()
a QuerySet rather than 1 value. Also its an .all()
query so it may well have multiple objects and it's not related to the form result.
make = Make.objects.all() # QuerySet = ([<Make: Samsung>], [<Make: Sony>], [<Make: Apple>], etc)
return HttpResponseRedirect(reverse('browse_makes', args=[make])) # Expects 1 value
Assuming you want to redirect to the Make
selected in the form then you'll need something like:
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}))
Upvotes: 2
Reputation: 53326
I think there are couple of issues
change this line
url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse.makes', name='browse_makes'),
to
url(r'^browse/(?P<make>[\w-]+)/$', 'axlepost.views.browse', name='browse_makes'),
Change your view definition to take make
parameter
def browse(request, make): ... #change your local variable 'make' to something else
Upvotes: 0