Django forms组件的使用教程


Posted in Python onOctober 08, 2018

编写Django的form表单,非常类似我们在模型系统里编写一个模型。在模型中,一个字段代表数据表的一列,而form表单中的一个字段代表<form>中的一个<input>元素。

一,forms组件:

校验字段功能

针对一个实例:注册用户讲解。

模型:models.py

class UserInfo(models.Model):
  name=models.CharField(max_length=32)
  pwd=models.CharField(max_length=32)
  email=models.EmailField()
  tel=models.CharField(max_length=32)

模板: register.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>

</head>
<body>

<form action="" method="post">
  {% csrf_token %} 
  <div>
    <label for="user">用户名</label>
    <p><input type="text" name="name" id="name"></p>
  </div>
  <div>
    <label for="pwd">密码</label>
    <p><input type="password" name="pwd" id="pwd"></p>
  </div>
  <div>
    <label for="r_pwd">确认密码</label>
    <p><input type="password" name="r_pwd" id="r_pwd"></p>
  </div>
   <div>
    <label for="email">邮箱</label>
    <p><input type="text" name="email" id="email"></p>
  </div>
  <input type="submit">
</form>

</body>
</html>

视图函数:register

# forms组件
from django.forms import widgets

wid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

class UserForm(forms.Form):
  name=forms.CharField(max_length=32,
             widget=wid_01
             )
  pwd=forms.CharField(max_length=32,widget=wid_02)
  r_pwd=forms.CharField(max_length=32,widget=wid_02)
  email=forms.EmailField(widget=wid_01)
  tel=forms.CharField(max_length=32,widget=wid_01)

def register(request):

  if request.method=="POST":
    form=UserForm(request.POST)
    if form.is_valid():
      print(form.cleaned_data)    # 所有干净的字段以及对应的值
    else:
      print(form.cleaned_data)    #
      print(form.errors)       # ErrorDict : {"校验错误的字段":["错误信息",]}
      print(form.errors.get("name")) # ErrorList ["错误信息",]
    return HttpResponse("OK")
  form=UserForm()
  return render(request,"register.html",locals())

1,渲染标签功能

渲染方式1

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<h3>注册页面</h3>
<div class="container">
  <div class="row">
    <div class="col-md-6 col-lg-offset-3">

        <form action="" method="post">
          {% csrf_token %}
          <div>
            <label for="">用户名</label>
            {{ form.name }}
          </div>
          <div>
            <label for="">密码</label>
            {{ form.pwd }}
          </div>
          <div>
            <label for="">确认密码</label>
            {{ form.r_pwd }}
          </div>
          <div>
            <label for=""> 邮箱</label>
            {{ form.email }}
          </div>

          <input type="submit" class="btn btn-default pull-right">
        </form>
    </div>
  </div>
</div>
</body>
</html>

渲染方式2

<form action="" method="post">
          {% csrf_token %}

          {% for field in form %}
            <div>
              <label for="">{{ field.label }}</label>
              {{ field }}
            </div>
          {% endfor %}
          <input type="submit" class="btn btn-default pull-right">

</form>

渲染方式3

<form action="" method="post">
  {% csrf_token %}

  {{ form.as_p }}
  <input type="submit" class="btn btn-default pull-right">

</form>

2,显示错误与重置输入信息功能

视图

def register(request):

  if request.method=="POST":
    form=UserForm(request.POST)
    if form.is_valid():
      print(form.cleaned_data)    # 所有干净的字段以及对应的值
    else:
      print(form.cleaned_data)    #
      print(form.errors)       # ErrorDict : {"校验错误的字段":["错误信息",]}
      print(form.errors.get("name")) # ErrorList ["错误信息",]
    return render(request,"register.html",locals())
  form=UserForm()
  return render(request,"register.html",locals())

模板

<form action="" method="post" novalidate>
  {% csrf_token %}

  {% for field in form %}
    <div>
      <label for="">{{ field.label }}</label>
      {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
    </div>
  {% endfor %}
  <input type="submit" class="btn btn-default">

</form>

3,局部钩子与全局钩子

模板

# forms组件
from django.forms import widgets

wid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

from django.core.exceptions import ValidationError
class UserForm(forms.Form):
  name=forms.CharField(max_length=32,
             widget=wid_01
             )
  pwd=forms.CharField(max_length=32,widget=wid_02)
  r_pwd=forms.CharField(max_length=32,widget=wid_02)
  email=forms.EmailField(widget=wid_01)
  tel=forms.CharField(max_length=32,widget=wid_01)

  # 局部钩子
  def clean_name(self):
    val=self.cleaned_data.get("name")
    if not val.isdigit():
      return val
    else:
      raise ValidationError("用户名不能是纯数字!")

  # 全局钩子

  def clean(self):
    pwd=self.cleaned_data.get("pwd")
    r_pwd=self.cleaned_data.get("r_pwd")

    if pwd==r_pwd:
      return self.cleaned_data
    else:
      raise ValidationError('两次密码不一致!')

def register(request):

  if request.method=="POST":
    form=UserForm(request.POST)
    if form.is_valid():
      print(form.cleaned_data)    # 所有干净的字段以及对应的值
    else:
      clean_error=form.errors.get("__all__")

    return render(request,"register.html",locals())
  form=UserForm()
  return render(request,"register.html",locals())

视图

<form action="" method="post" novalidate>
      {% csrf_token %}

      {% for field in form %}
        <div>
          <label for="">{{ field.label }}</label>
          {{ field }}
          <span class="pull-right" style="color: red">
             {% if field.label == 'R pwd' %}
             <span>{{ clean_error.0 }}</span>
             {% endif %}
             {{ field.errors.0 }}
          </span>
        </div>
      {% endfor %}
      <input type="submit" class="btn btn-default">

</form>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python pickle模块用法实例分析
May 27 Python
Python 中 list 的各项操作技巧
Apr 13 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
Python循环实现n的全排列功能
Sep 16 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
Python grpc超时机制代码示例
Sep 14 Python
Python爬虫爬取有道实现翻译功能
Nov 27 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
pandas取dataframe特定行列的实现方法
May 24 Python
分享Python获取本机IP地址的几种方法
Mar 17 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 #Python
面向初学者的Python编辑器Mu
Oct 08 #Python
Django 实现购物车功能的示例代码
Oct 08 #Python
一行代码让 Python 的运行速度提高100倍
Oct 08 #Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 #Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 #Python
Python中的函数式编程:不可变的数据结构
Oct 08 #Python
You might like
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
PHP也可以?成Shell Script
2006/10/09 PHP
第五章 php数组操作
2011/12/30 PHP
php解决约瑟夫环示例
2014/04/09 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
JavaScript this 深入理解
2009/07/30 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
如何用JavaScript定义一个类
2014/09/12 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
python选择排序算法的实现代码
2013/11/21 Python
Python中replace方法实例分析
2014/08/20 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
python2与python3共存问题的解决方法
2018/09/18 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
办公室主任个人总结
2015/02/28 职场文书
2015年安全月活动总结
2015/03/26 职场文书