改进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中让MySQL查询结果返回字典类型的方法
Aug 22 Python
Python中random模块生成随机数详解
Mar 10 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
用Python逐行分析文件方法
Jan 28 Python
多个python文件调用logging模块报错误
Feb 12 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
python 画条形图(柱状图)实例
Apr 24 Python
Python创建临时文件和文件夹
Aug 05 Python
使用django自带的user做外键的方法
Nov 30 Python
python基于tkinter实现gif录屏功能
May 19 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
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
joomla组件开发入门教程
2016/05/04 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
php函数式编程简单示例
2019/08/08 PHP
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
Jquery 设置标题的自动翻转
2009/10/03 Javascript
在模板页面的js使用办法
2010/04/01 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
fullpage.js全屏滚动插件使用实例
2016/09/06 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
python友情链接检查方法
2015/07/08 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
python中random模块详解
2021/03/01 Python
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
烹调加工管理制度
2014/02/04 职场文书
网络宣传方案
2014/03/15 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
论文评审意见
2015/06/05 职场文书
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
零基础学java之循环语句的使用
2022/04/10 Java/Android
MySQL时区造成时差问题
2022/04/13 MySQL
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS