表格确认

时间:2017-07-29 22:56:25

标签: python html django python-3.x

我正在尝试将数据从成功的表单提交传递到感谢页面,然后可以显示此数据。我正在尝试反向HttpResponseRedirect,但我不断收到此错误:

/ contactform / process的NoReverseMatch 使用参数'(24,)找不到'thankyou'的反转。尝试了1种模式:[u'contactform / thankyou / $']

这是我到目前为止的代码:

views.py

RelativeLayout

urls.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.views import generic


from .models import Contact_Object

def index(request):
    template_name = 'contactform/index.html'
    return render(request, 'contactform/index.html')

def thankyou(request, entered_id):
    contact_info = get_object_or_404(Contact_Object, pk=contact_object_id)
    template_name = 'contactform/thankyou.html'
    return render(request, 'contactform/thankyou.html', {name: contact_info.name})

def process(request):
        entered_name = request.POST['fullname']
        entered_email = request.POST['email']
        entered_message = request.POST['message']
        entered = Contact_Object(name=entered_name, email=entered_email, message=entered_message)
        entered.save()
        entered_id = entered.id
        return HttpResponseRedirect(reverse('contactform:thankyou', args=(entered.id,)))

表单模板

from django.conf.urls import url

from . import views

app_name = 'contactform'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^thankyou/$', views.thankyou, name='thankyou'),
    url(r'^process$', views.process, name='process'),
]

感谢页面的模板

<H1>Contact Form</H1>


<FORM action="{% url 'contactform:process' %}" method="post"> 
{% csrf_token %}
    Full Name:<br>
    <input type="text" name="fullname"><br>
    Email:<br>
    <input type="text" name="email" ><br>
    Message:<br>
    <textarea name="message" cols="40" rows="5"></textarea>
    <input type="submit" value="Enter"> 
</FORM>

我刚开始使用Python / Django所以我觉得这可能是一个明显的初学者错误,我似乎无法发现它。

提前致谢。

1 个答案:

答案 0 :(得分:2)

你的问题就在这里:

    return HttpResponseRedirect(reverse('contactform:thankyou', args=(entered.id,)))

thankyou网址没有任何参数。

url(r'^thankyou/$', views.thankyou, name='thankyou'),

要解决此问题,您应将其更改为:

url(r'^thankyou/([0-9]*)$', views.thankyou, name='thankyou'),

使用reverse函数和args kwarg,它会将其转换为可用的URL,例如:/thankyou/24插入args iterable中提供的参数。如果您在网址中使用关键字分组,也可以使用kwargs将关键字传递到您的网址。

见这里:https://docs.djangoproject.com/en/1.11/topics/http/urls/#example

每个正则表达式分组都是一个传递给视图的参数。

如果您执行以下网址,也可以传递关键字参数:

url(r'^thankyou/(?P<pk>[0-9]*)$', views.thankyou, name='thankyou'),

在基于函数的视图中,您可以通过在视图函数签名中定义它来访问它,如下所示:

def thankyou(request, pk=None):