zoukankan      html  css  js  c++  java
  • Django之forms.Form

    django中的form组件提供了普通表单提交及验证数据的主要功能:

    1.    生成页面可用的HTML标签

    2.    对用户提交的数据进行验证

    3.    可保留用户上次提交的数据

      

    django中使用form组件

    (一)在py文件(可以是视图,也可新建后在视图引入使用)创建一个form组件类,必须继承forms.Form(fromdjangoimportforms)

    1.    类中定义的字段都可在模板中渲染成相应的HTML表单标签

    class Inform(forms.Form):

    name=forms.CharField()

    #CharField类实例化的字段渲染后是type='text'input标签(实例化参数可以改变type类型)

     

         password=forms.CharField()

     

    2.    类中定义的字段根据实例化该字段的类生成不同的标签

    class Inform(forms.Form):

        name=forms.CharField()

     

    password = forms.CharField( 

    # 字段对象的类的实例化通过插件widget修改生成的HTML标签,attrs可以设置多个属性  

        # widget=forms.TextInput(attrs={'type': 'password'}),

        widget=forms.PasswordInput(render_value=True),#插件(设置保存密码)

    )

     

    3.    类中定义的字段的类的实例化可以设置相应的参数进行配置

    class Inform(forms.Form):

        name = forms.CharField(

        # required=True,  # 默认为True

        min_length=2,#最小长度

        max_length=6,#最大长度

        initial='张三'# 默认值

        help_text='长度为26个字符!'# 帮助信息

        error_messages=[{  #自定义错误提示信息(默认为英文)

            'required':'不能为空!',

            'min_length':'不能少于2个字符!'·

        }],

        validators=[],#自定义校验规则(列表中放自定义函数名,或者引入django内置的RegexValidator校验器)

        # disabled=True#默认为True显示

    )

     

        password = forms.CharField(

        # widget=forms.TextInput(attrs={'type': 'password'}),

        widget=forms.PasswordInput(),

    )

     

    (二)在相应的视图函数中实例化该类之后,当成模板变量通过render进行模板渲染时自定义form组件中的字段都会以标签显示

     

    views.py

     1 from django.shortcuts import render,HttpResponse
     2 from django import forms
     3 from app01 import models
     4 from django.core.validators import RegexValidator
     5 import re
     6 from django.core.exceptions import ValidationError
     7  
     8 #自定义校验函数,直接在字段validators中使用
     9 def name_valid(value):
    10     name_re=re.compile(r'^[a-zA-Z_]+$')
    11     if not name_re.match(value):
    12         raise ValidationError("只能以字母下划线开头!")
    13  
    14 class Myform(forms.Form):
    15     name = forms.CharField(
    16         # required=True,  # 默认为True
    17         min_length=2,
    18         max_length=6,
    19         initial='abc',  # 默认值
    20         help_text='长度为2到6个字符!',  # 帮助信息
    21         error_messages=[{  # 自定义错误提示信息(默认为英文)
    22             'required': '不能为空!',
    23             'min_length': '不能少于2个字符!'
    24         }],
    25         validators=[RegexValidator(r'^(w)+$','用户名只能有字母数字下划线组成!'), name_valid],  # 自定义校验规则(列表中放自定义函数名,或者引入django内置的RegexValidator校验器)
    26         # disabled=True#默认为True显示
    27      )
    28      # 密文
    29     password = forms.CharField(
    30         widget=forms.TextInput(attrs={'type': 'password'}),
    31     )
    32     # 日期
    33     birth = forms.DateField(
    34         widget=forms.TextInput(attrs={'type': 'date'})
    35     )
    36     # 单选
    37     sex = forms.ChoiceField(
    38         choices=[('0', ''), ('1', '')],
    39         # widget=forms.Select()#下拉单选(默认)
    40         # widget=forms.RadioSelect()#正常单选
    41  
    42         # widget = forms.CheckboxInput()#记住账号密码(label='记住账号密码',initial='checked',choices=[('True',1),('False',0)])
    43     )
    44  
    45     publish = forms.ModelChoiceField(
    46         queryset=models.Publish.objects.all()  # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象
    47         # widget和ChoiceFiled一样设置
    48     )
    49     # 多选
    50     hobby = forms.MultipleChoiceField(
    51  
    52         choices=[('1', 'wan '), ('2', 'ee')],
    53         # widget=forms.SelectMultiple()#下拉多选(默认)
    54         # widget=forms.CheckboxSelectMultiple()#正常多选
    55     )
    56     author = forms.ModelMultipleChoiceField(
    57         queryset=models.Author.objects.all()  # 只能用all结果才能正常显示,必须设置__str__,否则拿到是对象
    58         # widget和MultipleChoiceField一样设置
    59     )
    60  
    61     def __init__(self,*args,**kwargs):#初始化对字段进行样式设置
    62         super().__init__(*args,**kwargs)
    63          for filed in self.fields:
    64             self.fields[filed].widget.attrs.update({'class':'form-control'})
    65   
    66 def form(request):
    67     if request.method=='GET':
    68         form_obj=Myform()
    69         return  render(request, 'form.html', {'form_obj':form_obj})
    70     else:
    71         form_obj=Myform(request.POST)#对提交的数据进行组件类实例化
    72         if form_obj.is_valid():#校验提交的数据对象(字段校验-->validators校验(RegexValidator模块或者自定义函数)-->局部钩子-->全局钩子)
    73             print(form_obj.cleaned_data)#form_obj.clean_data已经校验完的所有值
    74             return HttpResponse('ok')
    75         else:
    76             return render(request,'form.html',{'form_obj':form_obj})#检测到错误,刷新页面,保留原数据
    views.py

    form.html

     1 {% load static %}
     2 <!DOCTYPE html>
     3 <html lang="en">
     4 <head>
     5     <meta charset="UTF-8">
     6     <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
     7     <title>form</title>
     8 </head>
     9 <body>
    10 <div class="container">
    11     <div class="row">
    12         <div class="col-xs-8 col-xs-offset-2">
    13             <h2>注册信息表:</h2>
    14             {% for field in form_obj %}
    15                 <p>
    16                 
    17 <label for="{{ field.id_for_label }}">{{ field.label }}</label>
    18 {{ field }}
    19 <span class="text-danger">{{ field.errors.0 }}</span> 
    20                 </p>
    21             {% endfor %} 
    22         </div>
    23     </div>
    24 </div>
    25 </body>
    26 <script src="{% static 'jquery-3.4.1.js' %}"></script>
    27 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
    28 </html>
    form.html
  • 相关阅读:
    关于Spring MVC跨域
    Linux(Debian) 上安装tomcat并注册服务开机自启动
    fastjson SerializerFeature详解
    Mysql group_concat函数被截断的问题
    eclipse中show whitespace characters显示代码空格,TAB,回车 导致代码乱恶心
    Oracle数据库之动态SQL
    tomcat日志报Invalid message received with signature的解决办法
    用HttpClient发送HTTPS请求报SSLException: Certificate for <域名> doesn't match any of the subject alternative names问题的解决
    高可用集群架构的演进
    database disk image is malformed
  • 原文地址:https://www.cnblogs.com/open-yang/p/11223120.html
Copyright © 2011-2022 走看看