I am trying to pass the id through reverse. But it’s not working. I’m getting this error
Reverse for ‘reg.views.thanks’ with arguments ‘(20,)’ and keyword arguments ‘{}’ not found.
Here is my views.py:
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.core.urlresolvers import reverse
from reg.models import registration, registrationform
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
def registration(request):
if request.method == 'POST':
form = registrationform(request.POST)
if form.is_valid():
data = form.save()
id = data.id
return thanks(request,id)
else:
form = registrationform()
return render_to_response('registration.html', {'form' : form}, context_instance=RequestContext(request))
def thanks(request, id):
p = get_object_or_404(registration, pk=id)
return render_to_response('thanks.html', {'reg' : p})
Here is my urls.py:
from django.conf.urls import patterns, include, url
url(r'^registration/$', 'reg.views.registration'),
url(r'^thanks/$', 'reg.views.thanks'),
url(r'^$','django.views.generic.simple.direct_to_template', {'template' : 'index.html'}),
)
Here is thanks.html:
<html>
<body>
<p>Thank you for registration mr.{{reg.username}}</p>
</body>
</html>
and I’m also showing my models.py:
from django.db import models
from django.forms import ModelForm
class registration(models.Model):
username = models.CharField(max_length=100)
password = models.CharField(max_length=100)
def __unicode__(self):
return self.name
class registrationform(ModelForm):
class Meta:
model = registration
Thanks.
This line
Is trying to construct a url to your view
reg.views.thanks, with theidvariable used as a parameter.This line in urls.py
Does not have anywhere for that parameter to go.
The first thing that you need to figure out is whether you actually want to send an HTTP redirect to the browser to tell it to go to the ‘thanks’ page. If you really do, then you need a way to send that id in the URL. You can do it as part of the URL path itself, as @moguzalp suggests, or you can put it in the query string, like
Or you can do other things, like stashing the id in the user’s session, and pulling it out when they request the thanks page. That’s a bit more complicated, though.
If you don’t actually need to issue an HTTP redirect, then there’s nothing stopping you from just calling the thanks() function from inside your view function, like this:
The URL won’t change in the browser, but the correct ID will be used, and doesn’t need to appear anywhere else, in the URL, the query parameters, or the session