reverse() 无法使用

0 投票
2 回答
2263 浏览
提问于 2025-04-17 09:05

我正在尝试通过反向解析传递一个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,而且不需要在网址、查询参数或会话中出现。

撰写回答