改进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 相关文章推荐
Linux下用Python脚本监控目录变化代码分享
May 21 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
Python画图学习入门教程
Jul 01 Python
Python常用算法学习基础教程
Apr 13 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
django反向解析和正向解析的方式
Jun 05 Python
python中scikit-learn机器代码实例
Aug 05 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
在Django的View中使用asyncio的方法
Jul 12 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
python中rc1什么意思
Jun 19 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
Python编程实现的简单Web服务器示例
2017/06/22 Python
Python模块文件结构代码详解
2018/02/03 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
平面设计自荐信
2013/10/07 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
竞选村长演讲稿
2014/04/28 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
家属答谢词
2015/01/05 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL