改进Django中的表单的简单方法


Posted in Python onJuly 17, 2015

首先,search()视图对于空字符串的处理相当薄弱——仅显示一条”Please submit a search term.”的提示信息。 若用户要重新填写表单必须自行点击“后退”按钮, 这种做法既糟糕又不专业。如果在现实的案例中,我们这样子编写,那么Django的优势将荡然无存。

在检测到空字符串时更好的解决方法是重新显示表单,并在表单上面给出错误提示以便用户立刻重新填写。 最简单的实现方法既是添加else分句重新显示表单,代码如下:

from django.http import HttpResponse
from django.shortcuts import render_to_response
from mysite.books.models import Book

def search_form(request):
  return render_to_response('search_form.html')

def search(request):
  if 'q' in request.GET and request.GET['q']:
    q = request.GET['q']
    books = Book.objects.filter(title__icontains=q)
    return render_to_response('search_results.html',
      {'books': books, 'query': q})
  else:
    **return render_to_response('search_form.html', {'error': True})**

(注意,将search_form()视图也包含进来以便查看)

这段代码里,我们改进来search()视图:在字符串为空时重新显示search_form.html。 并且给这个模板传递了一个变量error,记录着错误提示信息。 现在我们编辑一下search_form.html,检测变量error:

<html>
<head>
  <title>Search</title>
</head>
<body>
  **{% if error %}**
    **<p style="color: red;">Please submit a search term.</p>**
  **{% endif %}**
  <form action="/search/" method="get">
    <input type="text" name="q">
    <input type="submit" value="Search">
  </form>
</body>
</html>

我们修改了search_form()视图所使用的模板,因为search_form()视图没有传递error变量,所以在条用search_form视图时不会显示错误信息。

通过上面的一些修改,现在程序变的好多了,但是现在出现一个问题: 是否有必要专门编写search_form()来显示表单? 按实际情况来说,当一个请求发送至/search/(未包含GET的数据)后将会显示一个空的表单(带有错误信息)。 所以,只要我们改变search()视图:当用户访问/search/并未提交任何数据时就隐藏错误信息,这样就移去search_form()视图以及对应的URLpattern。

def search(request):
  error = False
  if 'q' in request.GET:
    q = request.GET['q']
    if not q:
      error = True
    else:
      books = Book.objects.filter(title__icontains=q)
      return render_to_response('search_results.html',
        {'books': books, 'query': q})
  return render_to_response('search_form.html',
    {'error': error})

在改进后的视图中,若用户访问/search/并且没有带有GET数据,那么他将看到一个没有错误信息的表单; 如果用户提交了一个空表单,那么它将看到错误提示信息,还有表单; 最后,若用户提交了一个非空的值,那么他将看到搜索结果。

最后,我们再稍微改进一下这个表单,去掉冗余的部分。 既然已经将两个视图与URLs合并起来,/search/视图管理着表单的显示以及结果的显示,那么在search_form.html里表单的action值就没有必要硬编码的指定URL。 原先的代码是这样:

<form action="/search/" method="get">

现在改成这样:

<form action="" method="get">

action=”“意味着表单将提交给与当前页面相同的URL。 这样修改之后,如果search()视图不指向其它页面的话,你将不必再修改action。

Python 相关文章推荐
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
python字符串过滤性能比较5种方法
Jun 22 Python
Python字典及字典基本操作方法详解
Jan 30 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
浅谈keras 模型用于预测时的注意事项
Jun 27 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
Python pandas之求和运算和非空值个数统计
Aug 07 Python
Python的Django框架中的表单处理示例
Jul 17 #Python
Python中max函数用法实例分析
Jul 17 #Python
详解Django中Request对象的相关用法
Jul 17 #Python
Python实现SVN的目录周期性备份实例
Jul 17 #Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 #Python
Python的Django框架下管理站点的基本方法
Jul 17 #Python
Django中更新多个对象数据与删除对象的方法
Jul 17 #Python
You might like
php 什么是PEAR?
2009/03/19 PHP
php HTML无刷新提交表单
2016/04/05 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
js单例模式的两种方案
2013/10/22 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
JAVA程序员面试题
2012/10/03 面试题
农业大学毕业生的个人自我评价
2013/10/11 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
平安建设工作方案
2014/06/02 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
公安机关起诉意见书
2015/05/20 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
golang操作rocketmq的示例代码
2022/04/06 Golang