改进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基础教程之udp端口扫描
Feb 10 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
浅谈tensorflow中张量的提取值和赋值
Jan 19 Python
Python ORM编程基础示例
Feb 02 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
Python Pivot table透视表使用方法解析
Sep 11 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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
JavaScript组合拼接字符串的效率对比测试
2014/11/06 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
纯JS实现本地图片预览的方法
2015/07/31 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
[02:08]2014DOTA2国际邀请赛 430专访:力争取得小组前二
2014/07/11 DOTA
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
新东网科技Java笔试题
2012/07/13 面试题
事业单位个人应聘自荐信
2013/09/21 职场文书
大学校庆策划书
2014/01/31 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
Python时间操作之pytz模块使用详解
2022/06/14 Python