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基于二分查找实现求整数平方根的方法
May 12 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
Python中的pack和unpack的使用
Mar 12 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
python机器学习库xgboost的使用
Jan 20 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
python3中布局背景颜色代码分析
Dec 01 Python
Python中Permission denied的解决方案
Apr 02 Python
如何使用flask将模型部署为服务
May 13 Python
python单元测试之pytest的使用
Jun 07 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
文件上传程序的全部源码
2006/10/09 PHP
PHP与SQL注入攻击[三]
2007/04/17 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
js实现内置计时器
2019/12/16 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
某个公司的Java笔面试题
2016/03/11 面试题
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
致运动员加油稿
2015/07/21 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书