改进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正则表达式re模块详细介绍
May 29 Python
python网络编程实例简析
Sep 26 Python
Python使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
python读取几个G的csv文件方法
Jan 07 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
Django实现celery定时任务过程解析
Apr 21 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
python简单验证码识别的实现过程
Jun 20 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连接access数据库方法
2013/11/11 PHP
PHP文件操作实例总结
2016/09/27 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
如何将网页表格内容导入excel
2014/02/18 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
Python的logging模块基本用法
2020/12/24 Python
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
2014两会学习心得:时代的发展
2014/03/17 职场文书
公司寄语大全
2014/04/10 职场文书
操行评语大全
2014/04/30 职场文书
护理专科学生自荐书
2014/07/05 职场文书
八项规定整改方案
2014/10/01 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏