обратный () не работает - PullRequest
       5

обратный () не работает

0 голосов
/ 27 декабря 2011

Я пытаюсь передать идентификатор через реверс.Но это не работает.Я получаю эту ошибку

Обратное для 'reg.views.thanks' с аргументами '(20,)' и ключевыми словами аргументы '{}' не найдены.

Вот мои взгляды.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'}),
)

Вот спасибо.html:

<html>
<body>
<p>Thank you for registration mr.{{reg.username}}</p>
</body>
</html>

и я также показываю свои модели.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 голосов
/ 27 декабря 2011

по этой ссылке (учебник по 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 голосов
/ 28 декабря 2011

Эта строка

return HttpResponseRedirect(reverse('reg.views.thanks', args=(id,)))

Пытается создать URL для вашего представления reg.views.thanks, в качестве параметра используется переменная id.

Эта строка в urls.py

url(r'^thanks/$', 'reg.views.thanks'),

Нет места для этого параметра.

Первое, что вам нужно выяснить, это то, действительно ли вы хотите отправить HTTP-перенаправление в браузер, чтобы он сказал перейти на страницу «Спасибо». Если это действительно так, то вам нужен способ отправить этот идентификатор в URL. Вы можете сделать это как часть самого URL-пути, как предлагает @moguzalp, или вы можете поместить его в строку запроса, например

/thanks/?id=12345

Или вы можете делать другие вещи, например, сохранять идентификатор в сеансе пользователя и извлекать его, когда они запрашивают страницу благодарности. Хотя это немного сложнее.

Если вам на самом деле не нужно выдавать 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))

URL-адрес не изменится в браузере, но будет использоваться правильный идентификатор, и его не нужно нигде отображать в URL-адресе, параметрах запроса или сеансе

...