我正试图通过反向传递id。但它不起作用。我收到此错误
反向'reg.views.thanks',参数'(20,)'和关键字参数'{}'找不到。
这是我的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})
这是我的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'}),
)
这是thanks.html:
<html>
<body>
<p>Thank you for registration mr.{{reg.username}}</p>
</body>
</html>
我也在展示我的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
感谢。
答案 0 :(得分:5)
从这个链接(django教程):
https://docs.djangoproject.com/en/dev/topics/http/urls/#django.core.urlresolvers.reverse
示例:
def myview(request):
return HttpResponseRedirect(reverse('arch-summary', args=[1945]))
所以你的代码转到:
在urls.py中:
url(r'^thanks/(?P<id>\d+)$', 'reg.views.thanks', name='my_thanks_url')
在您的函数中:
return HttpResponseRedirect(reverse('my_thanks_url', args=[id]))
答案 1 :(得分:3)
这一行
return HttpResponseRedirect(reverse('reg.views.thanks', args=(id,)))
尝试使用reg.views.thanks
变量作为参数构建您的视图id
的网址。
urls.py中的这一行
url(r'^thanks/$', 'reg.views.thanks'),
没有该参数的任何地方。
您需要弄清楚的第一件事是您是否确实要向浏览器发送HTTP重定向以告知它转到“感谢”页面。如果你真的这样做,那么你需要一种方法在URL中发送该id。您可以将其作为URL路径本身的一部分来执行,如@moguzalp建议的那样,或者您可以将其放在查询字符串中,例如
/thanks/?id=12345
或者您可以执行其他操作,例如在用户会话中存储ID,并在请求感谢页面时将其拉出。但这有点复杂。
如果您实际上不需要发出HTTP重定向,那么就没有什么能阻止您从视图函数中调用thanks()函数,如下所示:
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))
网址不会在浏览器中更改,但会使用正确的ID,并且无需在URL,查询参数或会话
中出现在任何其他位置