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

    校验字段功能:

    index.html

    <form action="" method="post">
        {% csrf_token %}
        <p>用户名<input type="text" name="username"></p>
        <p>密码<input type="password" name="password"></p>
        <p>确认密码<input type="password" name="r_password"></p>
        <p>邮箱<input type="email" name="email"></p>
        <input type="submit">
    </form>
    

    views.py(forms暂时先放在views.py,为了程序可读性更高应新建一个.py文件)

    from django import forms
    
    # 先定义forms组件类
    class UserForm(forms.Form):
        username = forms.CharField(min_length=6)
        password = forms.CharField(min_length=6)
        r_password = forms.CharField(min_length=6)
        email = forms.EmailField()
    
    
    def index(request):
        if request.method == 'POST':
    
            # 实例化form组件类的时候传入的参数要求:form表单name的属性必须与forms组件的字段名称相同
            form = UserForm(request.POST) #传入的是一个字典:{'username':'alexss}
            print(form.is_valid())# 布尔类型
            if form.is_valid(): # 判断是否校验成功(传入的参数规则能对应上类中的规则# )
                # 如果传入了一个类中没有定义的字段,则不会去进行校验,直接忽视
                print(form.cleaned_data) # 校验成功的字段放在该字典内
            else:
                print(form.changed_data) # 同样,校验成功的会在该字典内
                print(form.errors) # 校验失败的会放在该字典内,存放格式:字段名对应一个字段,字典内是错误信息
            return HttpResponse('OK')
        return render(request,'index.html')
    

    forms组件的渲染标签功能

    方式1:

    views.py

    from django import forms
    
    # 先定义forms组件类
    class UserForm(forms.Form):
        username = forms.CharField(min_length=6)
        password = forms.CharField(min_length=6)
        r_password = forms.CharField(min_length=6)
        email = forms.EmailField()
    
    
    def index(request):
        form = UserForm()
        return render(request,'index.html',locals())
    

    index.html

    <form action="" method="post">
        <p>
            用户名{{ form.username }}
        </p>
        <p>
            密码{{ form.password }}
        </p>
        <p>
            确认密码{{ form.r_password }}
        </p>
        <p>
            邮箱{{ form.email }}
        </p>
        <input type="submit">
    </form>
    

    方式2:在views.py中定义字段可以添加label属性,在渲染标签时,默认的form.label是字段名,可以在定义form是设置label属性

    views.py

    from django import forms
    
    # 先定义forms组件类
    class UserForm(forms.Form):
        username = forms.CharField(min_length=6,label='用户名')
        password = forms.CharField(min_length=6,label='密码')
        r_password = forms.CharField(min_length=6,label='确认密码')
        email = forms.EmailField(label='密码')
    
    
    def index(request):
        form = UserForm()
        return render(request,'index.html',locals())
    

    index.html

    <h3>forms组件渲染标签方式2</h3>
    <form action="" method="post">
        {% for filed in form %}
            <div>
                <label for="">{{ filed.label }}</label>
                {{ filed }}
            </div>
        {% endfor %}
        
        <input type="submit">
    </form>
    

    方式3:该方式不推荐使用,过于呆滞

    <form action="" method="post">
        {{ form.as_p }}
        <input type="submit">
    </form>
    

    forms组件的渲染错误信息

    <h3>form组件渲染标签方式1</h3>
    <form action="" method="post">
        {% csrf_token %}
        <p>{{ form.username.label }}
            {{ form.username }} <span>{{ form.username.errors.0 }}</span>
        </p>
        <p>{{ form.password.label }}
            {{ form.password }} <span>{{ form.password.errors.0 }}</span>
        </p>
        <p>{{ form.r_password.label }}
            {{ form.r_password }} <span>{{ form.r_password.errors.0 }}</span>
        </p>
        <p>{{ form.email.label }}
            {{ form.email }} <span>{{ form.email.errors.0 }}</span>
        </p>
        <input type="submit">
    </form>
    

    最新版本的django好像不需要forms组件去渲染,在输入时会自动进行校验,假如提交时不符合会弹出提示

    forms组件的参数配置

    渲染时使密码输入框显示秘文

    from django import forms
    from django.forms import widgets
    # 先定义forms组件类
    class UserForm(forms.Form):
        username = forms.CharField(min_length=6,label='用户名')
        password = forms.CharField(min_length=6,label='密码',widget=widgets.PasswordInput())
        # 在定义类时添加widget属性=widgets.PasswordInput()
        r_password = forms.CharField(min_length=6,label='确认密码',widget=widgets.PasswordInput())
        email = forms.EmailField(label='密码')
    

    渲染时给输入框添加样式类

    class UserForm(forms.Form):
        username = forms.CharField(min_length=6,label='用户名',widget=widgets.TextInput(attrs={"class":"form-control"}))
        password = forms.CharField(min_length=6,label='密码',widget=widgets.PasswordInput(attrs={"class":"form-control"}))
        r_password = forms.CharField(min_length=6,label='确认密码',widget=widgets.TextInput(attrs={"class":"form-control"}))
        email = forms.EmailField(label='密码',widget=widgets.TextInput(attrs={"class":"form-control"}))
    

    forms组件校验的局部钩子

    验证用户名与邮箱用户名是否存在

    class UserForm(forms.Form):
        username = forms.CharField(min_length=4,label='用户名',widget=widgets.TextInput(attrs={"class":"form-control"}))
        password = forms.CharField(min_length=4,label='密码',widget=widgets.PasswordInput(attrs={"class":"form-control"}))
        r_password = forms.CharField(min_length=4,label='确认密码',widget=widgets.TextInput(attrs={"class":"form-control"}))
        email = forms.EmailField(label='邮箱',widget=widgets.TextInput(attrs={"class":"form-control"}))
        
        def clean_username(self):
            val = self.cleaned_data.get('username')
            ret = UserInfo.objects.filter(username=val)
            if not ret:
                return val
            else:
                raise ValidationError("用户名已存在")
                
        def clean_email(self):
            val = self.cleaned_data.get('email')
            ret = UserInfo.objects.filter(email=val)
            if not ret:
                return val
            else:
                raise ValidationError("邮箱已存在")
                
    
    

    forms组件校验的全局钩子

    class UserForm(forms.Form):
        username = forms.CharField(min_length=4,label='用户名',widget=widgets.TextInput(attrs={"class":"form-control"}))
        password = forms.CharField(min_length=4,label='密码',widget=widgets.PasswordInput(attrs={"class":"form-control"}))
        r_password = forms.CharField(min_length=4,label='确认密码',widget=widgets.PasswordInput(attrs={"class":"form-control"}))
        email = forms.EmailField(label='邮箱',widget=widgets.TextInput(attrs={"class":"form-control"}))
        
        # 全局钩子
        def clean(self):
            pwd1 = self.cleaned_data.get('password')
            pwd2 = self.cleaned_data.get('r_password')
            if pwd1 == pwd2:
                return self.cleaned_data
            else:
                raise ValidationError('两次密码输入不一致')
    

    全局钩子捕获异常是使用form.error.get('all')

  • 相关阅读:
    愚人节,怎么让朋友吃屎(其实我是不想发这么低俗的文章的)
    水往地处流,人往地处走
    不够完美的步骤条(模仿淘宝重新绑定邮箱)
    The Django Book
    The Django Book
    Python 目录和文件基本操作
    The Django Book 第三章 试图和URL配置
    Django 表增加外键
    Linux下文件以及文件名编码转换
    Django添加tinyMCE编辑器
  • 原文地址:https://www.cnblogs.com/wualin/p/10125641.html
Copyright © 2011-2022 走看看