改进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编程中进行迭代和遍历
Jan 19 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
python 检查是否为中文字符串的方法
Dec 28 Python
利用python开发app实战的方法
Jul 09 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
python集成开发环境配置(pycharm)
Feb 14 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
python实现ROA算子边缘检测算法
Apr 05 Python
python字符串常规操作大全
May 02 Python
Python绘制散乱的点构成的图的方法
Apr 21 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
PHP无限分类的类
2007/01/02 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP 基本语法格式
2009/12/15 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
2013/11/27 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
python执行使用shell命令方法分享
2017/11/08 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
python实现最速下降法
2020/03/24 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
python中取绝对值简单方法总结
2020/07/24 Python
如何一键升级Python所有包
2020/11/05 Python
试用期转正鉴定评语
2014/01/27 职场文书
食品厂厂长岗位职责
2014/01/30 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
车辆年审委托书范本
2014/09/18 职场文书
学期个人自我总结
2015/02/13 职场文书
教师节寄语2015
2015/03/23 职场文书
2015年档案室工作总结
2015/05/23 职场文书
建党伟业电影观后感
2015/06/01 职场文书
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
mysql 获取相邻数据项
2022/05/11 MySQL