zoukankan      html  css  js  c++  java
  • forms组件

    forms组件

     

    1 校验字段功能

     

    针对一个实例:注册用户讲解。

    模型:models.py

    class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    email=models.EmailField()

    模板文件
    <!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>

    视图函数

    # forms组件
    from django import 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())

    2 渲染标签功能

    渲染页面方式一
                <h1>渲染页面方式一</h1>
                <form action="" method="post" novalidate>
                    <p>{{ form_obj.name.label }}:{{ form_obj.name }} <span
                            class="pull-right">{{ form_obj.name.errors.0 }}</span></p>
                    <p>密码:{{ form_obj.pwd }}<span class="pull-right">{{ form_obj.pwd.errors.0 }}</span></p>
                    <p>确认密码:{{ form_obj.re_pwd }}<span class="pull-right">{{ form_obj.re_pwd.errors.0 }}{{ errors }}</span></p>
                    <p>邮箱{{ form_obj.email }}<span class="pull-right">{{ form_obj.email.errors.0 }}</span></p>
                    <input type="submit">
                </form>
    渲染页面方式二
                <form action="" method="post" novalidate>
                    {% for foo in form_obj %}
                        <div>{{ foo.label }}{{ foo }}<span class="pull-right">{{ foo.errors }}</span></div>
    
                    {% endfor %}
                    <input type="submit">
    渲染页面方式三
                <form action="" method="post">
                    {{ form_obj.as_p }}
                </form>

    3 渲染错误信息功能(错误信息返回到前台)

    视图层

    from django import forms
    
    class RegForm(forms.Form):
        name = forms.CharField(required=True, max_length=10, min_length=2, label='用户名',
                               error_messages=
                               {'required': '该字段必填', 'max_length': '太长了', 'min_length': '太短了'})
        pwd = forms.CharField(max_length=10, min_length=2, label='密码')
        re_pwd = forms.CharField(max_length=10, min_length=2, label='确认密码')
        email = forms.EmailField(label='邮箱', error_messages={'required': '该字段必填', 'invalid': '不符合邮箱格式'})

    模板层

                <h1>渲染页面方式一</h1>
                <form action="" method="post" novalidate>
                    <p>{{ form_obj.name.label }}:{{ form_obj.name }} <span
                            class="pull-right">{{ form_obj.name.errors.0 }}</span></p>
                    <p>密码:{{ form_obj.pwd }}<span class="pull-right">{{ form_obj.pwd.errors.0 }}</span></p>
                    <p>确认密码:{{ form_obj.re_pwd }}<span class="pull-right">{{ form_obj.re_pwd.errors.0 }}{{ errors }}</span></p>
                    <p>邮箱{{ form_obj.email }}<span class="pull-right">{{ form_obj.email.errors.0 }}</span></p>
                    <input type="submit">
                </form>
                <hr>
                <h1>渲染页面方式二</h1>
                <form action="" method="post" novalidate>
                    {% for foo in form_obj %}
                        <div>{{ foo.label }}{{ foo }}<span class="pull-right">{{ foo.errors }}</span></div>
    
                    {% endfor %}
                    <input type="submit">

    4 组件的参数配置

    给前端的标签添加属性

    视图层

    from django.forms import widgets
    
    class RegForm(forms.Form):
        name = forms.CharField(required=True, max_length=10, min_length=2, label='用户名',
                               error_messages=
                               {'required': '该字段必填', 'max_length': '太长了', 'min_length': '太短了'},
                               widget=widgets.TextInput(attrs={'class':'form-control error','aa':'xxx'})
                               )
        pwd = forms.CharField(max_length=10, min_length=2, label='密码',widget=widgets.PasswordInput(attrs={'class':'form-control error','aa':'xxx'}))
        re_pwd = forms.CharField(max_length=10, min_length=2, label='确认密码',widget=widgets.PasswordInput(attrs={'class':'form-control error','aa':'xxx'}))
        # xx = forms.CharField(max_length=10, min_length=2, label='确认密码',widget=widgets.CheckboxInput())
        email = forms.EmailField(label='邮箱', error_messages={'required': '该字段必填', 'invalid': '不符合邮箱格式'},widget=widgets.EmailInput(attrs={'class':'form-control error','aa':'xxx'}))

     

    5 局部钩子  自定义校验规则

    6 全局钩子 自定义校验规则

    视图层

    from django import forms
    from django.forms import widgets
    
    from django.core.exceptions import  ValidationError
    
    class RegForm(forms.Form):
        name = forms.CharField(required=True, max_length=10, min_length=2, label='用户名',
                               error_messages=
                               {'required': '该字段必填', 'max_length': '太长了', 'min_length': '太短了'},
                               widget=widgets.TextInput(attrs={'class':'form-control error','aa':'xxx'})
                               )
        pwd = forms.CharField(max_length=10, min_length=2, label='密码',widget=widgets.PasswordInput(attrs={'class':'form-control error','aa':'xxx'}))
        re_pwd = forms.CharField(max_length=10, min_length=2, label='确认密码',widget=widgets.PasswordInput(attrs={'class':'form-control error','aa':'xxx'}))
        # xx = forms.CharField(max_length=10, min_length=2, label='确认密码',widget=widgets.CheckboxInput())
        email = forms.EmailField(label='邮箱', error_messages={'required': '该字段必填', 'invalid': '不符合邮箱格式'},widget=widgets.EmailInput(attrs={'class':'form-control error','aa':'xxx'}))
        # 局部钩子(多了一个我自己写校验规则的方式)
        # def clean_pwd(self): 固定这种格式
        def clean_name(self):
            name=self.cleaned_data.get('name')
            user=UserInfo.objects.filter(name=name).first()
            if user:
                raise ValidationError('用户已经存在')
            else:
                if name.startswith('sb'):
                    raise ValidationError('不能以sb开头')
                return name
        # 全局钩子 校验两次密码是否一致
        def clean(self):
            pwd=self.cleaned_data.get('pwd')
            re_pwd=self.cleaned_data.get('re_pwd')
            if pwd and re_pwd:
                if pwd==re_pwd:
                    return self.cleaned_data
                else:
                    raise ValidationError('两次密码不一致')

     

  • 相关阅读:
    虚函数和纯虚函数
    MS CRM 2011中PartyList类型字段的实例化
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(4)
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(2)
    MS CRM 2011的自定义和开发(10)——CRM web服务介绍(第二部分)——IOrganizationService(二)
    MS CRM 2011 SDK 5.08已经发布
    MS CRM 2011 Q2的一些更新
    最近很忙
    Microsoft Dynamics CRM 2011最近的一些更新
    补一篇,Update Rollup 12 终于发布了
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9668350.html
Copyright © 2011-2022 走看看