这篇文章主要介绍了简单解析Django框架中的表单验证,Django是Python重多人气框架中最为著名的一个,需要的朋友可以参考下

我们的搜索示例仍然相当地简单,特别从数据验证方面来讲;我们仅仅只验证搜索关键值是否为空。 然后许多HTML表单包比检测值是否为空更为复杂的验证。 我们都有在网站上见过类似以下的错误提示信息:

  •   请输入一个有效的email地址, foo' 并不是一个有效的e-mail地址。
  •   请输入5位数的U.S 邮政编码, 123并非是一个有效的邮政编码。
  •   请输入YYYY-MM-DD格式的日期。
  •   请输入8位数以上并至少包含一个数字的密码。

关于JavaScript验证

可以使用Javascript在客户端浏览器里对数据进行验证,这些知识已超出本书范围。 要注意: 即使在客户端已经做了验证,但是服务器端仍必须再验证一次。 因为有些用户会将JavaScript关闭掉,并且还有一些怀有恶意的用户会尝试提交非法的数据来探测是否有可以攻击的机会。

除了在服务器端对用户提交的数据进行验证(例如在视图里验证),我们没有其他办法。 JavaScript验证可以看作是额外的功能,但不能作为唯一的验证功能。

我们来调整一下search()视图,让她能够验证搜索关键词是否小于或等于20个字符。 (为来让例子更为显著,我们假设如果关键词超过20个字符将导致查询十分)。那么该如何实现呢? 最简单的方式就是将逻辑处理直接嵌入到视图里,就像这样:

def search(request):
  error = False
  if 'q' in request.GET:
    q = request.GET['q']
    if not q:
      error = True
    **elif len(q) > 20:**
      **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})

现在,如果尝试着提交一个超过20个字符的搜索关键词,系统不会执行搜索操作,而是显示一条错误提示信息。 但是,search_form.html里的这条提示信息是:”Please submit a search term.”,这显然是错误的, 所以我们需要更精确的提示信息:

<html>
<head>
  <title>Search</title>
</head>
<body>
  {% if error %}
    <p style="color: red;">Please submit a search term 20 characters or shorter.</p>
  {% endif %}
  <form action="/search/" method="get">
    <input type="text" name="q">
    <input type="submit" value="Search">
  </form>
</body>
</html>

但像这样修改之后仍有一些问题。 我们包含万象的提示信息很容易使人产生困惑: 提交一个空表单怎么会出现一个关于20个字符限制的提示? 所以,提示信息必须是详细的,明确的,不会产生疑议。

问题的实质在于我们只使用来一个布尔类型的变量来检测是否出错,而不是使用一个列表来记录相应的错误信息。 我们需要做如下的调整:

def search(request):
  **errors = []**
  if 'q' in request.GET:
    q = request.GET['q']
    if not q:
      **errors.append('Enter a search term.')**
    elif len(q) > 20:
      **errors.append('Please enter at most 20 characters.')**
    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',
    {**'errors': errors** })

接着,我们要修改一下search_form.html模板,现在需要显示一个errors列表而不是一个布尔判断。

<html>
<head>
  <title>Search</title>
</head>
<body>
  **{% if errors %}**
    **<ul>**
      **{% for error in errors %}**
      **<li>{{ error }}</li>**
      **{% endfor %}**
    **</ul>**
  **{% endif %}**
  <form action="/search/" method="get">
    <input type="text" name="q">
    <input type="submit" value="Search">
  </form>
</body>
</html>

最新资讯
京东物流王振辉:满意度达82% 今年投10亿奖励人才

京东物流王振辉:满意度

1月20日上午消息,京东物流举行2019年展望大会。京东物
告别“裸奔” 上海颁发首批个人网店营业执照

告别“裸奔” 上海颁

来源:IT之家作者:阿迷IT之家1月20日消息 据报道,日前,上海
尹振涛:互联网科技类金融控股公司的监管思路

尹振涛:互联网科技类金

在当前互联网金融风险专项整治及加强金融控股公司监管
猎豹移动傅盛:短视频是个很大机会 要求全公司关注

猎豹移动傅盛:短视频是

傅盛在现场还谈到短视频这个“风口”,他表示, 短视频是
搜狗王小川:AI意义在于将人类从低级活动中解放出来

搜狗王小川:AI意义在于

王小川提到,人工智能的意义在于将人从一些低级的脑力劳
今年铁路春运网络购票超八成 可网上刷脸认证

今年铁路春运网络购票

2018年1月4日,山西太原火车站,使用网络购票的旅客在自动
最新文章
对pandas中iloc,loc取数据差别及按条件取值的方法详解

对pandas中iloc,loc取

今天小编就为大家分享一篇对pandas中iloc,loc取数据差
详解如何为eclipse安装合适版本的python插件pydev

详解如何为eclipse安

这篇文章主要介绍了详解如何为eclipse安装合适版本的p
Python Series从0开始索引的方法

Python Series从0开始

今天小编就为大家分享一篇Python Series从0开始索引的
浅谈pandas用groupby后对层级索引levels的处理方法

浅谈pandas用groupby

今天小编就为大家分享一篇浅谈pandas用groupby后对层
python3 打开外部程序及关闭的示例

python3 打开外部程序

今天小编就为大家分享一篇python3 打开外部程序及关闭
使用python根据端口号关闭进程的方法

使用python根据端口号

今天小编就为大家分享一篇使用python根据端口号关闭进