Django-Form组件

发布时间 2023-05-22 11:18:09作者: sup小白

Form组件重点:

  1. ChoiceField 下拉框
    CharField 字段
    IntegerField 整数
    DecimalField 小数
    DataField 时间
    DataTimeField 日期
    EmailField 邮箱
    FileField 文件
    RegexField 正则

对用户请求的验证

- Ajax

- form

生产HTML代码startapp

创建app02

python manage.py startapp app02

a. 创建一个类

b. 类中创建字段(包含正则表达式)

c. GET

obj = Fr()

obj.user ===>自动生成html

d. POST

obj = Fr(request.POST)

if obj.is_valid():

obj.cleaned_data

else:

obj.errors

return ..... obj

引入模块

from django import forms

from django.forms import fields

class F1Form(forms.Form)

views.py

from django.shortcuts import render, HttpResponse, redirect
from django import forms
from django.forms import fields


class F1Form(forms.Form):
   user = fields.CharField(max_length=18,
                           min_length=6,
                           required=True,
                           error_messages={
                               'required': '用户名不能为空',
                               'max_length': '太长了',
                               'min_length': '太短了'
                          }
                          )
   pwd = fields.CharField(min_length=32,
                           required=True,
                           error_messages={
                           'required':'密码不能为空',
                           'min_length':'最少32位'
                          }
                          )
   age = fields.IntegerField(required=True,
                               error_messages={
                               'required':'年龄不能为空',
                               'invalid':'必须为数字'
                              }
                              )
   email = fields.EmailField(required=True,
                               min_length=8,
                               error_messages={
                               'required':'邮箱不能为空',
                               'invalid':'邮箱格式错误'
                              }
                              )


def f1(request):
   if request.method == "GET":
       obj = F1Form()
       return render(request, "f1.html",{'obj': obj})
   else:
       # u = request.POST.get('user') # 不能为空,长度6-18
       # p = request.POST.get('pwd') # 不能为空,长度为32
       # e = request.POST.get('email') # 不能为空,邮箱格式
       # a = request.POST.get('age') # 不能为空,数字类型
       # print(u, p, e, a)
       # 1.检查是否为空
       # 2.检查格式是否正确
       obj = F1Form(request.POST)
       if obj.is_valid():  # 是否全部验证成功
           print('验证成功', obj.cleaned_data)  # 用户提交的数据
           return redirect('https://www.baidu.com')
       else:
           print('验证失败', obj.errors)
           return render(request, 'f1.html', {'obj': obj})

f1.html

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>
   <form id="f1" action="/f1.html/" method="post">
       <p>{{ obj.user }}{{ obj.errors.user.0 }}</p>
       <p>{{ obj.pwd }}{{ obj.errors.pwd.0 }}</p>
       <p>{{ obj.age }}{{ obj.errors.age.0 }}</p>
       <p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
       <input type="submit" value="提交">
       <input type="button" value="Ajax提交" onclick="submitajax();">
   </form>

<script src="/static/jquery-3.6.4.js"></script>
<script>
   function submitajax() {
       $.ajax({
           url:"/f1.html/",
           type:"POST",
           data:$('#f1').serialize(),
           success:function (arg){
               console.log(arg)
          }
      })
  }
</script>
</body>
</html>

app02

Form组件里面的生产html代码的用法

from django.shortcuts import render
from django import forms
from django.forms import fields, widgets


# Create your views here.

class TextForm(forms.Form):
   user = fields.CharField(
       required=True,  # 是否必填
       max_length=32,  # 最大长度
       min_length=8,  # 最短长度
       error_messages={},  # 错误提示
       # widget=widgets.Select(), # 生成HTML标签
       # label='用户名',
       help_text='aaaaa',  #   帮助信息(在标签的旁边)
       show_hidden_initial=False, # 是否在当前插件后在加一个隐藏的且具有默认值的插件
       validators=[],  # 自定义验证规则,比如编写只能输入11位手机号的数字等等
       disabled=False,  # 是否可编辑状态 T 不可 F 可以
       label_suffix=':::',
       initial='aaa', # 文本框默认值
  )
   age = fields.IntegerField(
       label='年龄'
  )
   email = fields.EmailField(
       label='邮箱'
  )


def text(request):
   obj = TextForm()
   return render(request, 'text.html', {'obj': obj})
Field
   required=True,               是否允许为空
   widget=None,                 HTML插件
   label=None,                  用于生成Label标签或显示内容
   initial=None,                初始值
   help_text='',                帮助信息(在标签旁边显示)
   error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
   validators=[],               自定义验证规则
   localize=False,              是否支持本地化
   disabled=False,              是否可以编辑
   label_suffix=None            Label内容后缀


CharField(Field)
   max_length=None,             最大长度
   min_length=None,             最小长度
   strip=True                   是否移除用户输入空白

IntegerField(Field)
   max_value=None,              最大值
   min_value=None,              最小值

FloatField(IntegerField)
   ...

DecimalField(IntegerField)
   max_value=None,              最大值
   min_value=None,              最小值
   max_digits=None,             总长度
   decimal_places=None,         小数位长度

BaseTemporalField(Field)
   input_formats=None          时间格式化  

DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12

DurationField(Field)            时间间隔:%d %H:%M:%S.%f
   ...

RegexField(CharField)
   regex,                      自定制正则表达式
   max_length=None,            最大长度
   min_length=None,            最小长度
   error_message=None,         忽略,错误信息使用 error_messages={'invalid': '...'}

EmailField(CharField)      
   ...

FileField(Field)
   allow_empty_file=False     是否允许空文件

ImageField(FileField)      
   ...
   注:需要PIL模块,pip3 install Pillow
   以上两个字典使用时,需要注意两点:
       - form表单中 enctype="multipart/form-data"
       - view函数中 obj = MyForm(request.POST, request.FILES)

URLField(Field)
   ...


BooleanField(Field)  
   ...

NullBooleanField(BooleanField)
   ...

ChoiceField(Field)
   ...
   choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)
   required=True,             是否必填
   widget=None,               插件,默认select插件
   label=None,                Label内容
   initial=None,              初始值
   help_text='',              帮助提示


ModelChoiceField(ChoiceField)
   ...                        django.forms.models.ModelChoiceField
   queryset,                  # 查询数据库中的数据
   empty_label="---------",   # 默认空显示内容
   to_field_name=None,        # HTML中value的值对应的字段
   limit_choices_to=None      # ModelForm中对queryset二次筛选
   
ModelMultipleChoiceField(ModelChoiceField)
   ...                        django.forms.models.ModelMultipleChoiceField


   
TypedChoiceField(ChoiceField)
   coerce = lambda val: val   对选中的值进行一次转换
   empty_value= ''            空值的默认值

MultipleChoiceField(ChoiceField)
   ...

TypedMultipleChoiceField(MultipleChoiceField)
   coerce = lambda val: val   对选中的每一个值进行一次转换
   empty_value= ''            空值的默认值

ComboField(Field)
   fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                              fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])

MultiValueField(Field)
   PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用

SplitDateTimeField(MultiValueField)
   input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
   input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']

FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中
   path,                      文件夹路径
   match=None,                正则匹配
   recursive=False,           递归下面的文件夹
   allow_files=True,          允许文件
   allow_folders=False,       允许文件夹
   required=True,
   widget=None,
   label=None,
   initial=None,
   help_text=''

GenericIPAddressField
   protocol='both',           both,ipv4,ipv6支持的IP格式
   unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1PS:protocol必须为both才能启用

SlugField(CharField)           数字,字母,下划线,减号(连字符)
   ...

UUIDField(CharField)           uuid类型

Django Form内置字段