• 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('两次密码不一致')

     

  • 相关阅读:
    Python父类调用子类
    Python中for else注意事项
    JS Number类型数字位数及IEEE754标准
    cocos打包到ios与android上音频推荐
    JS学习之预解析(执行上下文)
    JS学习之函数的作用域
    JS学习之函数二
    JS学习之函数
    如何在subline中高亮显示.vue文件
    JS之正则
  • 原文地址:https://www.cnblogs.com/xujinjin18/p/9668350.html
Copyright © 2020-2023  润新知