forms组件

上周内容补充:

  前后端数据传输的编码格式:

    1.urlencoded

    2.formdata

    3.appliation/json

web中的请求过程中http格式的form请求基本包含:

  请求首行  POST  HTTP/1.1

  请求头(k:v键值对)

  标识编码:编码格式

  请求体

  form表单默认的编码格式是 urlencoded 不支持 发文件(只能把文件名发送过去)

  form表单所对应的数据格式  例如: username=jason&password=123

  request.POST只能解析 urlencoded 数据格式的数据

  formdata django 会帮你把文件数据取出来 放入request.FILES里面   专门用来传文件的

web中用Ajax传输数据的格式:

  Ajax默认提交的编码格式也是 urlencoded

  当用 ajax 传输 json 格式的数据的时候 django 不会做任何的处理,

  数据以二进制的形式放在 request.body 中可以手动解码加反序列化拿到对应的字典格式数据 

  ajax 发送文件    利用js内置的FormData对象  

  Ajax发送json格式数据:
    $.ajax({
        url:'', // 不写默认朝当前页面所在的url地址提交
        type:'post',
        contentType:'application/json',
        data:JSON.stringify({'name':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'}),
        success:function (data) {
                  alert(data)
        }
      }) 

  Ajax发送文件格式数据:
    $('#d1').click(function () {
      // 如果用ajax发送文件 需要使用内置对象FormData
      var formData = new FormData(); // 生成一个内置对象
      // 内置对象formdata既可以传普通的键值对,也可以传文件
      formData.append('name','jason'); // 普通键值对
      formData.append('password','123');
      // 传文件
      var fileObj = $('#d2')[0].files[0]; // 先获取标签对象 转成原生js对象 通过内置的files方

                      法拿到列表 然后去索引0拿到文件对象
      formData.append('myfile',fileObj);
      $.ajax({
        url:'', // 不写默认朝当前页面所在的url地址提交
        type:'post',
        // 注意ajax在发送文件的时候 需要你手动指定两个特殊的参数


        contentType:false, // 不要用任何编码 使用我formdata自带的编码即可
        processData:false, // 浏览器不要处理我的数据 是什么就什么

        data:formData,
        success:function (data) {
              alert(data)
                  }

                })
              })

form组件的应用:

一、forms组建的主要功能:

  1.将前端渲染展示页面,获取用户输入

  2.将数据发送给后端进行数据的合法性校验

  3.将不合法的提示信息展示给用户看

二、数据的校验:

  1.前端

  2.后端

  数据的校验前端可以没有,但后端一定要做!

三、 forms组件能实现具体功能:

 1.校验数据:

   forms组件的校验数据的使用

   1.定义一个继承forms.Form一个类

   from django import forms

     class MYForm(forms.Form):    

       username = forms.CharField(max_length=6) # username最长只能是6位
       password = forms.CharField(max_length=8,min_length=3) # password最长8位 最短3位

    2.给组件传参数(字典的显示方式): 

    obj = views.MyForm({'username':'egondsb','password':'12','email':'123@qq.com'})

   3.查看数据是否合法:

    obj.is_valid()

   4.查看所有校验通过的数据:

    obj.cleaned_data
    {'email': '123@qq.com'}

   5.查看所有没有通过的数据:

     obj.errors

      """
      {
        'username': ['Ensure this value has at most 6 characters (it has 7).'],
        'password': ['Ensure this value has at least 3 characters (it has 2).']}
      """

  2.渲染标签:

  forms组件只能帮你渲染 获取用户输入(输入框 选择框 下拉框...)的标签提交按钮也得自己写

  form表单取消前端校验功能
  <form action="" method="post" novalidate>

  forms组件当前端输入的信息不合法的时候 页面上的数据保留不会刷新  这样方便用户修改

  3.展示提示信息: 

  {% for foo in form_obj %}
  <p>
    {{ foo.label }}{{ foo }}
    <span>{{ foo.errors.0 }}</span>
  </p>
  {% endfor %}

  4.forms组件的钩子函数:

  

def clean_username(self):
  # 用户名中不能有666
  username = self.cleaned_data.get('username')
  if '666' in username:
  self.add_error('username','光喊666是不行的')
  return username

# 全局钩子
  def clean(self):
    # 获取密码和确认密码比对
    password = self.cleaned_data.get('password')
    confirm_password = self.cleaned_data.get('confirm_password')
    if not password == confirm_password:
    self.add_error('confirm_password','两次密码不一致')
    return self.cleaned_data

django中测试脚本书写
import os
import sys

if __name__ == "__main__":
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day66.settings")
  import django
  django.setup()

from app01 import models
print(models.Userinfo.objects.all())

原文地址:https://www.cnblogs.com/sry622/p/11226988.html