我正在尝试将数据从成功的表单提交传递到感谢页面,然后可以显示此数据。我正在尝试反向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所以我觉得这可能是一个明显的初学者错误,我似乎无法发现它。
提前致谢。
答案 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):