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实现定制交互式命令行的方法
Jul 03 Python
python threading模块操作多线程介绍
Apr 08 Python
python字典get()方法用法分析
Apr 17 Python
Python 装饰器深入理解
Mar 16 Python
Python代码缩进和测试模块示例详解
May 07 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
pandas中的series数据类型详解
Jul 06 Python
python中的&amp;&amp;及||的实现示例
Aug 07 Python
Python字节单位转换实例
Dec 05 Python
python通过matplotlib生成复合饼图
Feb 06 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python中四舍五入的正确打开方式
Jan 18 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
Express.JS使用详解
2014/07/17 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
详解Python中DOM方法的动态性
2015/04/11 Python
Python编码类型转换方法详解
2016/07/01 Python
Anaconda入门使用总结
2018/04/05 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
详解python中的线程与线程池
2019/05/10 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
Python中的Cookie模块如何使用
2020/06/04 Python
python中封包建立过程实例
2021/02/18 Python
幼师自荐信范文
2013/10/06 职场文书
优秀食品类广告词
2014/03/19 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
出纳试用期自我评价
2015/03/10 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
跑吧孩子观后感
2015/06/10 职场文书
话题作文之学会尊重
2019/12/16 职场文书
nginx服务器的下载安装与使用详解
2021/08/02 Servers
Python实现对齐打印 format函数的用法
2022/04/28 Python