contact表单错误解决记录

在上篇表单验证中,过程中可谓坎坷,记录一下错误问题及解决方案。

我们用到的模板contact_form.html如下,其他urls.py自行去修改。

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if errors %}
    <ul>
        {% for error in errors %}
        <li>{{ error }}</li>
        {% endfor %}
    </ul>
    {% endif %}

    <form action="/contact/" method="post">
        <p>Subject: <input type="text" name="subject"></p>
        <p>Your e-mail (optional): <input type="text" name="email"></p>
        <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

视图函数

 1 from django.core.mail import send_mail
 2 from django.http import HttpResponseRedirect
 3
 4 def contact(request):
 5     errors = []
 6     if request.method == ‘POST‘:
 7         if not request.POST.get(‘subject‘, ‘‘):
 8             errors.append(‘Enter a subject.‘)
 9         if not request.POST.get(‘message‘, ‘‘):
10             errors.append(‘Enter a message.‘)
11         if request.POST.get(‘email‘) and ‘@‘ not in request.POST[‘email‘]:
12             errors.append(‘Enter a valid e-mail address.‘)
13         if not errors:
14             try:
15                 send_mail(
16                     request.POST[‘subject‘],
17                     request.POST[‘message‘],
18                     request.POST.get(‘email‘, ‘[email protected]‘),
19                     [‘[email protected]‘],
20                     )
21             except:
22                 return HttpResponse("exception.")
23
24             return HttpResponseRedirect(‘/contact/thanks/‘)
25     return render_to_response(‘contact_form.html‘,
26         {‘errors‘: errors})

由于这示例是个发送邮件,而本地不一定配置了相关环境,我们使用简单地Console backend进行输出邮件内容。

只需要在settings.py中增加如下一句即可:

EMAIL_BACKEND = ‘django.core.mail.backends.console.EmailBackend‘

我们的视图方法很简单,发送邮件成功(dos窗口会输出邮件相关信息),并转向到thanks视图;失败则会停留在本页并提示错误。

方法看似没问题,可是执行看一下结果(下图是输入正确或错误一样的结果截图,也就是response时候的错误)

针对该问题进行查找解决方案,并一点点修改。

首先引入RequestContext

from django.template import Context,RequestContext

修改模板中加入

1 <form action="/contact/" method="post">
2         {% csrf_token %}
3         <p>Subject: <input type="text" name="subject"></p>
4         <p>Your e-mail (optional): <input type="text" name="email"></p>
5         <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
6         <input type="submit" value="Submit">
7     </form>

settings.py中添加的那个CsrfViewMiddleware,在原来的配置中就是包含的,不用管。再进行查看结果,还是一样的!这里就不贴图了。

想想我们唯一的改动就是增加了一个模块类RequestContext,但是他有什么用呢?我们并没有改动代码,是不是它对代码会有什么影响?

官网上有这样一段示例

return render_to_response(‘my_template.html‘,
                          my_data_dictionary,
                          context_instance=RequestContext(request))

和我们的视图函数中是不一样的!

参照这个示例,我们开始修改视图:

 1 def contact(request):
 2     errors = []
 3     if request.method == ‘POST‘:
 4         if not request.POST.get(‘subject‘, ‘‘):
 5             errors.append(‘Enter a subject.‘)
 6         if not request.POST.get(‘message‘, ‘‘):
 7             errors.append(‘Enter a message.‘)
 8         if request.POST.get(‘email‘) and ‘@‘ not in request.POST[‘email‘]:
 9             errors.append(‘Enter a valid e-mail address.‘)
10         if not errors:
11             try:
12                 send_mail(
13                     request.POST[‘subject‘],
14                     request.POST[‘message‘],
15                     request.POST.get(‘email‘, ‘[email protected]‘),
16                     [‘[email protected]‘],
17                     )
18             except:
19                 return HttpResponse("exception.")
20
21             return HttpResponseRedirect(‘/contact/thanks/‘)
22     return render_to_response(‘contact_form.html‘,
23         {‘errors‘: errors},context_instance=RequestContext(request))

我们增加了这一句,然后看效果吧

okay,我们成功了!

当我们输入正确的邮箱时,正确跳转到thanks视图,效果如下:

顺便一提,在我们的dos窗口看到了邮件信息,说明settings.py中的那一句还是好用的:

最终的视图函数如下

 1 from django.template import Context,RequestContext
 2 from django.core.mail import send_mail
 3 from django.http import HttpResponseRedirect
 4
 5 def contact(request):
 6     errors = []
 7     if request.method == ‘POST‘:
 8         if not request.POST.get(‘subject‘, ‘‘):
 9             errors.append(‘Enter a subject.‘)
10         if not request.POST.get(‘message‘, ‘‘):
11             errors.append(‘Enter a message.‘)
12         if request.POST.get(‘email‘) and ‘@‘ not in request.POST[‘email‘]:
13             errors.append(‘Enter a valid e-mail address.‘)
14         if not errors:
15             try:
16                 send_mail(
17                     request.POST[‘subject‘],
18                     request.POST[‘message‘],
19                     request.POST.get(‘email‘, ‘[email protected]‘),
20                     [‘[email protected]‘],
21                     )
22             except:
23                 return HttpResponse("exception.")
24
25             return HttpResponseRedirect(‘/contact/thanks/‘)
26     return render_to_response(‘contact_form.html‘,
27         {‘errors‘: errors},context_instance=RequestContext(request))
28
29 def thanks(request):
30     return HttpResponse("thanks for your suggestion!")

模板如下

 1 <html>
 2 <head>
 3     <title>Contact us</title>
 4 </head>
 5 <body>
 6     <h1>Contact us</h1>
 7
 8     {% if errors %}
 9     <ul>
10         {% for error in errors %}
11         <li>{{ error }}</li>
12         {% endfor %}
13     </ul>
14     {% endif %}
15
16     <form action="/contact/" method="post">
17         {% csrf_token %}
18         <p>Subject: <input type="text" name="subject"></p>
19         <p>Your e-mail (optional): <input type="text" name="email"></p>
20         <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
21         <input type="submit" value="Submit">
22     </form>
23 </body>
24 </html>

注意:

return HttpResponseRedirect(‘/contact/thanks/‘)

这只是一个普通的HttpResponse,不可修改如下

return HttpResponseRedirect(‘/contact/thanks/‘,context_instance=RequestContext(request))

报错如下

小结

有问题是好事,解决问题的过程,能学到更多东西,继续加油!

contact表单错误解决记录

时间: 2024-11-01 16:16:04

contact表单错误解决记录的相关文章

# Django admin、form表单的应用记录

目录 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 form组件使用 1. form的作用 2. form组件生成HTMKL代码 3. form组件校验数据有效性 3. form组件如何给html标签设置默认值 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 1. 创建超级用户 python manage.py createsuperuser username: wph password: 1231

MVC5 自定义表单错误信息

1. 2. 3. MVC5 自定义表单错误信息

js提交表单错误:document.form.submit() is not a function

今天在写JS时,遇上这么个错误:"document.form.submit() is not a function",经过一番搜索,最终找到了修复方法. 这个错误一般是由于表单<form>-</form>中含有name="submit"时,提交时就会有冲突,这个错误常见于按钮上,如: 在Javascript做submit()的时候就会出现冲突,这时将name="submit"改成别的名字就可以了:即使不是按钮,在表单的输入

jquery submit()不能提交表单的解决方法

今天写表单提交的时候需要增加一个确认提示,所以没有使用submit按钮提交,改用jq的submit(),然后问题了 <form class="form-horizontal m-t" method="post" action="@Url.Action("Edit")" id="form"> <div class="row"> <div class="

virtualbox 错误解决记录

1,E_INVALIDARG (0x80070057),virtualbox中Cannot register the hard disk错误解决办法 virtualbox中加载已有的虚拟硬盘时出现Cannot register the hard disk错误,描述类似下面的.打开 虚拟硬盘 /home/kylinfish/virtualhost/opensuse.vmdk 失败. Cannot register the hard disk '/home/kylinfish/virtualhost

避免浏览器自动填充表单的解决方式

以前在做项目的时候遇到过这个问题,当时年少太轻狂,没有想过是为什么会发生这样的问题,只觉得作为一个用户,每次在登录网站的时候很有用,很便捷,甚至觉得这个自动填充功能,嗯, 真棒!但是,这次又遇到了这个问题,我不禁陷入了沉思...为什么会有自动填充呢?为什么会变成黄色框框呢?作为一个开发者,在我不需要它自动填充的时候,它真的,很碍事! 于是乎~各种谷歌百度,试了一堆方法,终于让我解决了这个问题!!! 首先,在浏览器有点击过记住密码的操作的前提下,在直接写两个input,type分别等于text和p

jquery and jquery validation 错误解决记录

Cannot read property 'settings' of undefined jquery validation 这个问题常常发生在动态添加rule的时候. 解决方法 // 在timeout 方法中加入规则. setTimeout(function() { $('#my_field').rules('add', { required: true }) }, 0);  

Keil RTX使用 os_mut_init 报Hard Fault 错误解决记录

首先确定你的软件是在互斥信号初始化的位置,在以下几个位置,将会报Hard Fault 错误: (1).os_sys_init_user 用户线程创建之前 (2).os_tsk_create_user之后 规范写法: /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口. *

http 500错误解决记录

错误截图; 解决方案截图: