改进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实现挑选出来100以内的质数
Mar 24 Python
python数据结构之图的实现方法
Jul 08 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
Python将DataFrame的某一列作为index的方法
Apr 08 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
对python Tkinter Text的用法详解
Oct 11 Python
python爬虫获取百度首页内容教学
Dec 23 Python
十行代码使用Python写一个USB病毒
Jun 21 Python
python字典和json.dumps()的遇到的坑分析
Mar 11 Python
python安装和pycharm环境搭建设置方法
May 27 Python
python多线程和多进程关系详解
Dec 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添加文章时生成静态HTML文章的实现代码
2013/02/17 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
[01:39]2014DOTA2国际邀请赛 Newbee经理CU专访队伍火力全开
2014/07/15 DOTA
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
2014年教师节寄语
2014/04/03 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
教师继续教育反思周记
2015/06/25 职场文书
考研经验交流会策划书
2015/11/02 职场文书
Django如何与Ajax交互
2021/04/29 Python
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android