array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 15 Django组件 - forms组件  Django组件 - forms组件 - 爱码网

 

一、校验字段功能

       利用下面一个注册新用户的示例,来学习forms表单组件的功能。

1、校验字段功能

       模型:models.py

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

       模板:register.html

 
    <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
            <form action="" method="post" novalidate>
                {% csrf_token %}
                <div>
                    <label for="name">用户名</label>
                    <p><input type="text" name="name" ></p>
                </div>
                <div>
                    <label for="pwd">密码</label>
                    <p><input type="password" name="pwd" ></p>
                </div>
                <div>
                    <label for="r_pwd">确认密码</label>
                    <p><input type="password" name="r_pwd" ></p>
                </div>
                 <div>
                    <label for="email">邮箱</label>
                    <p><input type="text" name="email" ></p>
                </div>
                <div>
                    <label for="tel">手机号</label>
                    <p><input type="text" name="tel" ></p>
                </div>
                <input type="submit">
            </form>
        </body>
        </html>
 

       视图函数:view.py

 
     from django.shortcuts import render,HttpResponse
     from django import forms
     from django.forms import widgets

     from app01.models import UserInfo

        wid_01=widgets.TextInput(attrs={"class":"form-control"})
        wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

        class UserForm(forms.Form):    # 定义一个forms组件类
            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)  # 所有干净的字段以及对应的值
                    UserInfo.objects.create(**form.cleaned_data)
                else:
                    print(form.cleaned_data) # {"字段1":"值1","字段2":"值2"}
                    print(form.errors)       # ErrorDict : {"校验错误的字段":["错误信息",]}
                    print(form.errors.get("name")) # ErrorList ["错误信息",]
                return render(request,"register.html",locals())
            form=UserForm()
            return render(request,"register.html",locals())
 

2、渲染标签功能

       方式一(不常用,不够灵活):

    <form action="" method="post" novalidate >
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" class="btn btn-default pull-right">
    </form>

       方式二:

 
    <form action="" method="post" novalidate >
            {% csrf_token %}
            <div>
                <label for="id_name">用户名</label>
                {{ form.name }} 
            </div>
            <div>
                <label for="id_pwd">密码</label>
                {{ form.pwd }}
            </div>
            <div>
                <label for="id_r_pwd">确认密码</label>
                {{ form.r_pwd }}
            </div>
            <div>
                <label for="id_email"> 邮箱</label>
                {{ form.email }} 
            </div>
            <div>
                <label for="id_tel"> 手机号</label>
                {{ form.tel }} 
            </div>
            <input type="submit" class="btn btn-default pull-right">
    </form>
 

       方式三(for循环遍历,常用):

 
    <form action="" method="post" novalidate >
            {% csrf_token %}
            {% for field in form %}
                <div>
                    <label for="">{{ field.label }}</label>
                    {{ field }}
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-default pull-right">
    </form>
 

3、显示错误与重置输入信息功能

       模板:register.html

 
    <form action="" method="post" novalidate>
            {% csrf_token %}
    
            {% for field in form %}
                <div>
                    <label for="">{{ field.label }}</label>
                    {{ field }} 
                    <span style="color: red">{{ field.errors.0 }}</span>
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-default">
    </form>
 

4、局部钩子与全局钩子

       视图:views.py

 
    from django.shortcuts import render,HttpResponse
     from django import forms
     from django.forms import widgets
     from app01.models import UserInfo

        wid_01=widgets.TextInput(attrs={"class":"form-control"})
        wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

        class UserForm(forms.Form):    # 定义一个forms组件类
            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 clean_name(self):
            val=self.cleaned_data.get("name")
            if not val.isdigit():
                return val
            else:
                raise ValidationError("用户名不能是纯数字!")
        # 全局钩子
        def clean(self):
            pwd=self.cleaned_data.get("pwd")
            r_pwd=self.cleaned_data.get("r_pwd")
            if pwd and r_pwd:
                if pwd==r_pwd:
                    return self.cleaned_data
                else:
                    raise ValidationError('两次密码不一致!')
            else:
                return self.cleaned_data
        def register(request):
            if request.method=="POST":
                form=UserForm(request.POST)
                if form.is_valid():
                    print(form.cleaned_data)  # 所有干净的字段以及对应的值
                    UserInfo.objects.create(**form.cleaned_data)
                else:
                    print(form.cleaned_data) # {"字段1":"值1","字段2":"值2"}
                    print(form.errors)       # ErrorDict : {"校验错误的字段":["错误信息",]}
                    print(form.errors.get("name")) # ErrorList ["错误信息",]
                    clean_error=form.errors.get("__all__")
                return render(request,"register.html",locals())
            form=UserForm()
            return render(request,"register.html",locals())
 

一、校验字段功能

       利用下面一个注册新用户的示例,来学习forms表单组件的功能。

1、校验字段功能

       模型:models.py

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

       模板:register.html

 
    <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
            <form action="" method="post" novalidate>
                {% csrf_token %}
                <div>
                    <label for="name">用户名</label>
                    <p><input type="text" name="name" ></p>
                </div>
                <div>
                    <label for="pwd">密码</label>
                    <p><input type="password" name="pwd" ></p>
                </div>
                <div>
                    <label for="r_pwd">确认密码</label>
                    <p><input type="password" name="r_pwd" ></p>
                </div>
                 <div>
                    <label for="email">邮箱</label>
                    <p><input type="text" name="email" ></p>
                </div>
                <div>
                    <label for="tel">手机号</label>
                    <p><input type="text" name="tel" ></p>
                </div>
                <input type="submit">
            </form>
        </body>
        </html>
 

       视图函数:view.py

 
     from django.shortcuts import render,HttpResponse
     from django import forms
     from django.forms import widgets

     from app01.models import UserInfo

        wid_01=widgets.TextInput(attrs={"class":"form-control"})
        wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

        class UserForm(forms.Form):    # 定义一个forms组件类
            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)  # 所有干净的字段以及对应的值
                    UserInfo.objects.create(**form.cleaned_data)
                else:
                    print(form.cleaned_data) # {"字段1":"值1","字段2":"值2"}
                    print(form.errors)       # ErrorDict : {"校验错误的字段":["错误信息",]}
                    print(form.errors.get("name")) # ErrorList ["错误信息",]
                return render(request,"register.html",locals())
            form=UserForm()
            return render(request,"register.html",locals())
 

2、渲染标签功能

       方式一(不常用,不够灵活):

    <form action="" method="post" novalidate >
            {% csrf_token %}
            {{ form.as_p }}
            <input type="submit" class="btn btn-default pull-right">
    </form>

       方式二:

 
    <form action="" method="post" novalidate >
            {% csrf_token %}
            <div>
                <label for="id_name">用户名</label>
                {{ form.name }} 
            </div>
            <div>
                <label for="id_pwd">密码</label>
                {{ form.pwd }}
            </div>
            <div>
                <label for="id_r_pwd">确认密码</label>
                {{ form.r_pwd }}
            </div>
            <div>
                <label for="id_email"> 邮箱</label>
                {{ form.email }} 
            </div>
            <div>
                <label for="id_tel"> 手机号</label>
                {{ form.tel }} 
            </div>
            <input type="submit" class="btn btn-default pull-right">
    </form>
 

       方式三(for循环遍历,常用):

 
    <form action="" method="post" novalidate >
            {% csrf_token %}
            {% for field in form %}
                <div>
                    <label for="">{{ field.label }}</label>
                    {{ field }}
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-default pull-right">
    </form>
 

3、显示错误与重置输入信息功能

       模板:register.html

 
    <form action="" method="post" novalidate>
            {% csrf_token %}
    
            {% for field in form %}
                <div>
                    <label for="">{{ field.label }}</label>
                    {{ field }} 
                    <span style="color: red">{{ field.errors.0 }}</span>
                </div>
            {% endfor %}
            <input type="submit" class="btn btn-default">
    </form>
 

4、局部钩子与全局钩子

       视图:views.py

 
    from django.shortcuts import render,HttpResponse
     from django import forms
     from django.forms import widgets
     from app01.models import UserInfo

        wid_01=widgets.TextInput(attrs={"class":"form-control"})
        wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

        class UserForm(forms.Form):    # 定义一个forms组件类
            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 clean_name(self):
            val=self.cleaned_data.get("name")
            if not val.isdigit():
                return val
            else:
                raise ValidationError("用户名不能是纯数字!")
        # 全局钩子
        def clean(self):
            pwd=self.cleaned_data.get("pwd")
            r_pwd=self.cleaned_data.get("r_pwd")
            if pwd and r_pwd:
                if pwd==r_pwd:
                    return self.cleaned_data
                else:
                    raise ValidationError('两次密码不一致!')
            else:
                return self.cleaned_data
        def register(request):
            if request.method=="POST":
                form=UserForm(request.POST)
                if form.is_valid():
                    print(form.cleaned_data)  # 所有干净的字段以及对应的值
                    UserInfo.objects.create(**form.cleaned_data)
                else:
                    print(form.cleaned_data) # {"字段1":"值1","字段2":"值2"}
                    print(form.errors)       # ErrorDict : {"校验错误的字段":["错误信息",]}
                    print(form.errors.get("name")) # ErrorList ["错误信息",]
                    clean_error=form.errors.get("__all__")
                return render(request,"register.html",locals())
            form=UserForm()
            return render(request,"register.html",locals())
 

相关文章: