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处理json数据中的中文
Mar 06 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
跟老齐学Python之有点简约的元组
Sep 24 Python
python根据文件大小打log日志
Oct 09 Python
Python中的装饰器用法详解
Jan 14 Python
使用Python编写一个最基础的代码解释器的要点解析
Jul 12 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
Python数据分析matplotlib设置多个子图的间距方法
Aug 03 Python
Python非单向递归函数如何返回全部结果
Dec 18 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
python实现双链表
May 25 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
php中var_export与var_dump的区别分析
2010/08/21 PHP
PHP日期处理函数 整型日期格式
2011/01/12 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
快速查询Python文档方法分享
2017/12/27 Python
python 阶乘累加和的实例
2019/02/01 Python
详解python中init方法和随机数方法
2019/03/13 Python
Python 导入文件过程图解
2019/10/15 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
python如何写个俄罗斯方块
2020/11/06 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
售后服务科岗位职责范文
2013/11/13 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
少年闰土教学反思
2014/02/22 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
python中if和elif的区别介绍
2021/11/07 Python