zoukankan      html  css  js  c++  java
  • 【Django入坑之路】Form组件

    1:From组件的简单使用

    1创建From:

     1 #导入模块
     2 from django import forms
     3 from django.forms import fields, widgets  # 导入自定制插件
     4 
     5 
     6 class F1(forms.Form):
     7     #自定制插件:widget=widgets.TextInput(attrs={'class': 123})设置属性
     8     user = fields.CharField(min_length=3, max_length=18,                    widget=widgets.TextInput(attrs={'class': 123})) 
     9 
    10     age = fields.IntegerField(required=True)
    11     email = fields.EmailField(required=True)
    12     file = fields.FileField(required=False)
    13     # TypedChoiceField ---- coerce=lambda x: int(x)接收的值转换成int类型
    14     city = fields.TypedChoiceField(choices=((0, '上海'), (1, '北京'),), initial=1, coerce=lambda x: int(x))
    15     # 多选框
    16     hobby = fields.MultipleChoiceField(choices=((0, '000'), (1, '111'), (2, '222'), (3, '333')), initial=(2, 3)) 
    View Code

    2:函数处理:

     1 from app03.form import F1 # 从创建的应用aoo03下导入from文件里的F1
     2 
     3 def F1(reuqest):
     4      If request.method==”GET”:  
     5            F1.obj  = F1()         #创建FORM组件定义的输入框
     6      Return render(request,”html文件”, {“obj”:obj})  #输入框传到前端,错误提示保留数据
     7 
     8      If reqeust.method == “POST”:        
     9            F1.obj = F1(request.POST)  #实例化自定义的FORM组件,接收数据
    10      If obj.is_valid():        #  is_valid()  验证是否符合定义的正则
    11          print("验证成功",obj.cleaned_data)     #查看成功数据  
    12     
    13     #######这个位置可以扩展数据库验证之类的操作,或者直接使用钩子验证
    14         return redirect("http://想去的网址")
    15 
    16     else:
    17         print("验证失败",obj.errors)          #显示错误的提示 
    18      Return render(request,”html文件”, {“obj”:obj})     #降错误的提示传给前端
    19 
    20     注意:这里的GET与POST请求实例化FORM类的对象名(这里是obj)最好用一样的,否则会出现提交后输入框消失的情况
    View Code

    3:生成HTML:

     1  #上传文件要加上enctype="multipart/form-data"   novalidate
     2  #不适用浏览器默认错误提示要加上 novalidate
     3  
     4  <form action="/app03/project/" method="POST" enctype="multipart/form-data"   novalidate>
     5          <p>user:{{ obj.user }} {{ obj.errors.user.0}}</p>
     6          <p>age:{{ obj.age }}     {{ obj.errors.age.0}}</p>
     7          <p>email:{{ obj.email }}{{ obj.errors.email.0}}</p>
     8          <p>{{ obj.file }}{{ obj.errors.file.0}}</p>
     9          <p>{{ obj.city }}{{ obj.errors.city.0}}</p>
    10          <p>{{ obj.hobby }}{{ obj.errors.hobby.0}}</p>
    11         <p><input type="submit" value="提交"></p>
    12 </form>
    View Code

    2:FROM类常用属性

    1:Django常用内置字段:

     1 Field
     2     required=True,               是否允许为空
     3     widget=None,                 HTML插件
     4     label=None,                  用于生成Label标签或显示内容
     5     initial=None,                初始值
     6     help_text='',                帮助信息(在标签旁边显示)
     7     error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错误'}
     8     show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
     9     validators=[],               自定义验证规则
    10     localize=False,              是否支持本地化
    11     disabled=False,              是否可以编辑
    12     label_suffix=None            Label内容后缀
    13 
    14 
    15 CharField(Field)
    16     max_length=None,             最大长度
    17     min_length=None,             最小长度
    18     strip=True                   是否移除用户输入空白
    19 
    20 IntegerField(Field)
    21     max_value=None,              最大值
    22     min_value=None,              最小值
    23 
    24 FileField(Field)
    25     allow_empty_file=False     是否允许空文件
    26 
    27 ImageField(FileField)      
    28     ...
    29     注:需要PIL模块,pip3 install Pillow
    30     以上两个字典使用时,需要注意两点:
    31         - form表单中 enctype="multipart/form-data"
    32         - view函数中 obj = MyForm(request.POST, request.FILES)
    33 
    34 
    35 ChoiceField(Field)
    36     ...
    37     choices=(),                选项,如:choices = ((0,'上海'),(1,'北京'),)
    38     required=True,             是否必填
    39     widget=None,               插件,默认select插件
    40     label=None,                Label内容
    41     initial=None,              初始值
    42     help_text='',              帮助提示
    43 
    44 
    45 ModelChoiceField(ChoiceField)
    46     ...                        django.forms.models.ModelChoiceField
    47     queryset,                  # 查询数据库中的数据
    48     empty_label="---------",   # 默认空显示内容
    49     to_field_name=None,        # HTML中value的值对应的字段
    50     limit_choices_to=None      # ModelForm中对queryset二次筛选
    View Code

     2:Django内置插件:

     1 TextInput(Input)
     2 NumberInput(TextInput)
     3 EmailInput(TextInput)
     4 URLInput(TextInput)
     5 PasswordInput(TextInput)
     6 HiddenInput(TextInput)
     7 Textarea(Widget)
     8 DateInput(DateTimeBaseInput)
     9 DateTimeInput(DateTimeBaseInput)
    10 TimeInput(DateTimeBaseInput)
    11 CheckboxInput
    12 Select
    13 NullBooleanSelect
    14 SelectMultiple
    15 RadioSelect
    16 CheckboxSelectMultiple
    17 FileInput
    18 ClearableFileInput
    19 MultipleHiddenInput
    20 SplitDateTimeWidget
    21 SplitHiddenDateTimeWidget
    22 SelectDateWidget
    View Code

    3:全局钩子,局部钩子

     1 1:全局钩子:
     2 
     3 #两个密码校验
     4     def clean(self):
     5         pwd = self.cleaned_data.get("password") #校验后的name=password属性密码
     6         re_pwd = self.cleaned_data.get("again_password") #校验后的name=again_password属性密码
     7         if pwd != re_pwd:
     8            #如果不一致就添加错误信息返回
     9             self.add_error("again_password",ValidationError("两次密码不一致"))
    10         else:
    11             return self.cleaned_data    
    12 
    13 #局部钩子--用户名
    14     def clean_username(self):  #clean_验证的字段
    15         username = self.cleaned_data.get("username") #拿到输入的字段
    16         obj_user = models.UserInfo.objects.filter(username = username)#数据库查找这个字段
    17        
    18         if obj_user: #如果存在
    19             self.add_error("username",ValidationError("用户名已存在"))
    20         else:
    21             return username
    22 
    23 
    24 #局部钩子--手机号去重
    25     def clean_phone(self):  #clean_验证的字段
    26         phone = self.cleaned_data.get("phone")   #拿到输入的字段
    27         obj_user = models.UserInfo.objects.filter(phone=phone) #数据库查找这个字段
    28         # 如果存在
    29         if obj_user:
    30             self.add_error("phone", ValidationError("手机号已存在"))
    31         else:
    32             return phone
    View Code
  • 相关阅读:
    debian10
    Containerd 学习
    Java8中list转map方法总结
    微服务难点:基础数据如何设计,为做到共享,我们这样做
    Linux 取两个文件的交集、差集、并集
    Nginx部署图片、视频服务
    python PIL/cv2/base64相互转换
    sql 查询昨日,今日数据
    GridView组件 以及动态GridView
    ListView 基础列表组件、水平 列表组件、图标组件
  • 原文地址:https://www.cnblogs.com/wanghong1994/p/11589913.html
Copyright © 2011-2022 走看看