改进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中内置的NotImplemented类型的用法
Mar 31 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
Python中的枚举类型示例介绍
Jan 09 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
Python3监控疫情的完整代码
Feb 20 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
django queryset 去重 .distinct()说明
May 19 Python
Python使用os.listdir和os.walk获取文件路径
May 21 Python
浅析pandas随机排列与随机抽样
Jan 22 Python
python中 .npy文件的读写操作实例
Apr 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 htmlspecialchars加强版
2010/02/16 PHP
PHP array 的加法操作代码
2010/07/24 PHP
PHP中几个常用的魔术常量
2012/02/23 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
简介JavaScript中strike()方法的使用
2015/06/08 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
python变量不能以数字打头详解
2016/07/06 Python
详解Python中类的定义与使用
2017/04/11 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
python3.6数独问题的解决
2019/01/21 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
个人对照检查材料
2014/02/12 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
学生会2016感恩节活动小结
2016/04/01 职场文书
Nginx缓存设置案例详解
2021/09/15 Servers
Redis keys命令的具体使用
2022/06/05 Redis