改进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 06 Python
Python函数式编程
Jul 20 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Python2与Python3的区别详解
Feb 09 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
Python如何让字典保持有序排列
Apr 29 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中通过curl smtp发送邮件
2012/06/05 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
Javascript和jquery在selenium的使用过程
2019/10/31 jQuery
node.js文件操作系统实例详解
2019/11/05 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
python学习笔记:字典的使用示例详解
2014/06/13 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
python 进程的几种创建方式详解
2019/08/29 Python
python实现logistic分类算法代码
2020/02/28 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
python的launcher用法知识点总结
2020/08/07 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
python利用opencv实现颜色检测
2021/02/23 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
寄语是什么意思
2014/04/10 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
办理护照工作证明
2014/10/10 职场文书
原告代理词范文
2015/05/25 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python