reverse() 无法使用
我正在尝试通过反向解析传递一个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
谢谢。
2 个回答
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]))
3
这一行
return HttpResponseRedirect(reverse('reg.views.thanks', args=(id,)))
是在试图构建一个指向你的视图 reg.views.thanks
的网址,并且使用 id
变量作为参数。
在 urls.py 里的这一行
url(r'^thanks/$', 'reg.views.thanks'),
没有地方可以放那个参数。
你首先需要弄清楚的是,你是否真的想要给浏览器发送一个 HTTP 重定向,让它去 'thanks' 页面。如果你确实想这样做,那么你需要在网址中发送那个 id。你可以像 @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,而且不需要在网址、查询参数或会话中出现。