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

我们用到的模板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>

视图函数

 from django.core.mail import send_mail
 from django.http import HttpResponseRedirect

 def contact(request):
     errors = []
     if request.method == 'POST':
         if not request.POST.get('subject', ''):
             errors.append('Enter a subject.')
         if not request.POST.get('message', ''):
             errors.append('Enter a message.')
         if request.POST.get('email') and '@' not in request.POST['email']:
             errors.append('Enter a valid e-mail address.')
         if not errors:
             try:
                 send_mail(
                     request.POST['subject'],
                     request.POST['message'],
                     request.POST.get('email', 'noreply@example.com'),
                     ['siteowner@example.com'],
                     )
             except:
                 return HttpResponse("exception.")

             return HttpResponseRedirect('/contact/thanks/')
     return render_to_response('contact_form.html',
         {'errors': errors})

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

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

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

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

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

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

首先引入RequestContext

from django.template import Context,RequestContext

修改模板中加入

 <form action="/contact/" method="post">
         {% csrf_token %}
         <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>

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

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

官网上有这样一段示例

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

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

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

 def contact(request):
     errors = []
     if request.method == 'POST':
         if not request.POST.get('subject', ''):
             errors.append('Enter a subject.')
         if not request.POST.get('message', ''):
             errors.append('Enter a message.')
         if request.POST.get('email') and '@' not in request.POST['email']:
             errors.append('Enter a valid e-mail address.')
         if not errors:
             try:
                 send_mail(
                     request.POST['subject'],
                     request.POST['message'],
                     request.POST.get('email', 'noreply@example.com'),
                     ['siteowner@example.com'],
                     )
             except:
                 return HttpResponse("exception.")

             return HttpResponseRedirect('/contact/thanks/')
     return render_to_response('contact_form.html',
         {'errors': errors},context_instance=RequestContext(request))

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

okay,我们成功了!

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

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

最终的视图函数如下

 from django.template import Context,RequestContext
 from django.core.mail import send_mail
 from django.http import HttpResponseRedirect

 def contact(request):
     errors = []
     if request.method == 'POST':
         if not request.POST.get('subject', ''):
             errors.append('Enter a subject.')
         if not request.POST.get('message', ''):
             errors.append('Enter a message.')
         if request.POST.get('email') and '@' not in request.POST['email']:
             errors.append('Enter a valid e-mail address.')
         if not errors:
             try:
                 send_mail(
                     request.POST['subject'],
                     request.POST['message'],
                     request.POST.get('email', 'noreply@example.com'),
                     ['siteowner@example.com'],
                     )
             except:
                 return HttpResponse("exception.")

             return HttpResponseRedirect('/contact/thanks/')
     return render_to_response('contact_form.html',
         {'errors': errors},context_instance=RequestContext(request))

 def thanks(request):
     return HttpResponse("thanks for your suggestion!")

模板如下

 <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">
         {% csrf_token %}
         <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>

注意:

return HttpResponseRedirect('/contact/thanks/')

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

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

报错如下

小结

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

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

  1. JS、jqueryie6浏览器下使用js无法提交表单的解决办法

    -----------------------JS.jqueryie6浏览器下使用js无法提交表单的解决办法---------------------------------------------- ...

  2. 错误解决记录------------rhel安装Mysql软件包依赖 mariadb组件

    错误解决记录------------软件包依赖 mariadb组件 错误信息: 错误:软件包:akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda) 需要:maria ...

  3. 让input表单输入框不记录输入过信息的方法

    有过表单设计经验的朋友肯定知道,当我们在浏览器中输入表单信息的时候,往往input文本输入框会记录下之前提交表单的信息,以后每次只要双击input文本输入框就会出现之前输入的文本,这样有时会觉得比较方 ...

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

    <form id="form" method="get"> <input type="text" name="q ...

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

    今天在写JS时,遇上这么个错误:"document.form.submit() is not a function",经过一番搜索,最终找到了修复方法. 这个错误一般是由于表单&l ...

  6. vue2.0 element-ui中input的@keyup.native.enter=&#39;onQuery&#39;回车查询刷新整个表单的解决办法

    项目中用的element-ui是v1.4.3版本 实现的功能是在input中输入查询的名称,按下键盘回车键,可以查询表格中数据 问题是,我输入名称,按下回车,会整个表单刷新,搜索条件也被清空:代码如下 ...

  7. virtualbox 错误解决记录

    1,E_INVALIDARG (0x80070057),virtualbox中Cannot register the hard disk错误解决办法 virtualbox中加载已有的虚拟硬盘时出现Ca ...

  8. idea配置SOLServer错误解决记录

    1.错误信息:2019-03-26 13:32:41.205 ERROR 7828 --- [nio-8081-exec-1] c.alibaba.druid.filter.stat.StatFilt ...

  9. linq to entity 查询数据表是错误解决

    错误提示: 解决方式:换成了 linq to sql方式

随机推荐

  1. 数量经济学推荐的Julia教程

    http://quant-econ.net/jl/learning_julia.html Julia最为号称和c媲美的运行速度,想python一下简单的语法,虽然发展还不完善,但任然值得去关注. Ju ...

  2. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  3. 免费在线loading生成。

    loading这个在项目中也是经常要使用,这里推荐一个网站http://www.ajaxload.info/可以在线生成loading. 进来页面是这样的. 勾选transparent将会生成透明的g ...

  4. Linux 网络编程详解十二

    UDP的特点 --无连接 --基于消息的数据传输服务 --不可靠 --UDP更加高效 UDP注意点 --UDP报文可能会丢失,重复 --UDP报文可能会乱序 --UDP缺乏流量控制(UDP缓冲区写满之 ...

  5. ThreadLocal原理及其实际应用

    前言 java猿在面试中,经常会被问到1个问题: java实现同步有哪几种方式? 大家一般都会回答使用synchronized, 那么还有其他方式吗? 答案是肯定的, 另外一种方式也就是本文要说的Th ...

  6. Appnium安装——Mac篇

    mac下搭建appium环境有两种方法: 1.直接下载appium.dmg 运行即可 2.使用node从命令行运行appium Mac下的appnium环境搭建 一.首先安装homebrew 1.首先 ...

  7. 解决安装rpm时lib冲突:libstdc++-2-libc6.1-1-2.9.0.so from install of compat-libstdc++-7.3-2.96.118 conflicts with file from ...

    sudo rpm -ivh xxx.rpm -aid --force [oracle@localhost Oracle]$ .i386.rpm compat-libstdc++-devel-.i386 ...

  8. Metadata file not found - Data.Entity.Model

    错误 3 正在编译转换: 未能找到元数据文件“F:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\..\IDE\Micr ...

  9. 利用抽象、多态实现无反射的绿色环保ORM框架

    最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...

  10. 【转】android蓝牙开发---与蓝牙模块进行通信--不错

    原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利, ...