改进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 相关文章推荐
Django框架教程之正则表达式URL误区详解
Jan 28 Python
django 删除数据库表后重新同步的方法
May 27 Python
python实现windows下文件备份脚本
May 27 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
对Django中内置的User模型实例详解
Aug 16 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
python中删除某个元素的方法解析
Nov 05 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 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中include()与require()的区别说明
2017/02/14 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
jquery 常用操作方法
2010/01/28 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
说一说Python logging
2016/04/15 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
数组越界问题
2015/10/21 面试题
工商管理实习自我鉴定
2013/09/28 职场文书
大学生的网络创业计划书
2013/12/26 职场文书
工业学校毕业生自荐书
2014/01/03 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
工作睡觉检讨书
2014/02/25 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2015年个人思想总结
2015/03/09 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python