reverse()不起作用

时间:2011-12-27 18:55:45

标签: python django django-views django-urls

我正试图通过反向传递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 个答案:

答案 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,查询参数或会话

中出现在任何其他位置