改进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通过urllib2爬网页上种子下载示例
Feb 24 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
python3 读写文件换行符的方法
Apr 09 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
python占位符输入方式实例
May 27 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
Python-openCV读RGB通道图实例
Jan 17 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
Python中re模块的元字符使用小结
Apr 07 Python
Python&Matlab实现樱花的绘制
Apr 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php命名空间学习详解
2014/02/27 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
php中动态修改ini配置
2014/10/14 PHP
PHP编写的图片验证码类文件分享
2016/06/06 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
JavaScript DOM基础
2015/04/13 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
python基础教程之获取本机ip数据包示例
2014/02/10 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python导入pandas具体步骤方法
2019/06/23 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
学习Python需要哪些工具
2020/09/04 Python
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
《花瓣飘香》教学反思
2014/04/15 职场文书
教师求职自荐书
2014/06/14 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
参加招聘会后的感想
2015/08/10 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL
Nginx四层负载均衡的配置指南
2021/06/11 Servers
python not运算符的实例用法
2021/06/30 Python
javascript数组includes、reduce的基本使用
2021/07/02 Javascript