改进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的Django框架中的数据过滤功能
Jul 17 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
Python函数装饰器实现方法详解
Dec 22 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
python中bytes和str类型的区别
Oct 21 Python
Python 限定函数参数的类型及默认值方式
Dec 24 Python
解决pytorch报错:AssertionError: Invalid device id的问题
Jan 10 Python
python求前n个阶乘的和实例
Apr 02 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
详解php几行代码实现CSV格式文件输出
2017/07/01 PHP
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
使用JavaScript破解web
2018/09/28 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
Golang与python线程详解及简单实例
2017/04/27 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
大学学生会竞选演讲稿
2014/04/25 职场文书
团支部推优材料
2014/05/21 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书