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

    一 form组件的存在,简化了form的验证等操作。

    二 导入form

    from django import forms

    三 最简单的例子

      前端代码

    <form action="/form_login/" method="post">
        <p>姓名:{{ formlogin.username }}</p>
        <p>密码:{{ formlogin.password }}</p>
        <p><input type="submit" value="提交"></p>
    </form>

      视图代码

    class FormLogin(forms.Form):
        username=forms.CharField(min_length=5, max_length=10, error_messages={'required': '不能为空!', 'min_length': '最小长度为5!',
                                                                             'max_length': '最大长度为10!'})
        password=forms.CharField(min_length=5, max_length=10, error_messages={'required': '不能为空!', 'min_length': '最小长度为5!',
                                                                             'max_length': '最大长度为10!'})  #error_message={},自定义错误信息。如果没有这个参数,默认错误信息是英文。
    
    def form_login(request):
        if request.method=='POST':
            formlogin=FormLogin(request.POST)      #绑定数据的表单实例
        formlogin=FormLogin()                      #未绑定数据的表单实例
        print('formlogin',formlogin,type(formlogin))
        return render(request,'form_login.html',{'formlogin':formlogin})

      输出:

    formlogin <tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" maxlength="10" minlength="5" required id="id_username" /></td></tr>
    <tr><th><label for="id_password">Password:</label></th><td><input type="text" name="password" maxlength="10" minlength="5" required id="id_password" /></td></tr> <class 'app01.views.FormLogin'>

      Django给每个input框的id默认取值为id_+FormLogin的字段

    四 form组件微进阶

      准备知识

      登录成功是cleaned_data 是个什么东西

    def form_login(request):
        if request.method=='POST':
            formlogin=FormLogin(request.POST)
            if formlogin.is_valid():
                print(formlogin.cleaned_data,type(formlogin.cleaned_data))
                return HttpResponse('ok')

      输出:

    {'username': 'aaaaaaaaa', 'password': 'aaaaaa'} <class 'dict'>

      cleaned_data是一个字典。

      判断成功:,username=cleaned_data.get('username'),password=cleaned_data.get('password')。

            User.objects.filter(username='username',password='password'),判断用户名,密码是否正确。

            更为高端更为屌的写法是:User.objects.filter(**cleaned_data)。注意,input的name值须与与auth.user表的相关联的字段名保持一致。

      判断失败:这才是我们更需要关心的重点。

        登录不成功时,errors是个什么东西

    def form_login(request):
        if request.method=='POST':
            formlogin=FormLogin(request.POST)
            if formlogin.is_valid():
                print(formlogin.cleaned_data,type(formlogin.cleaned_data))
                return redirect('/index/')
            else:
                print(formlogin.errors,type(formlogin.errors))  #formlogin.errers格式是ErrorDict
                return HttpResponse('ok')

        输出:

    <ul class="errorlist"><li>username<ul class="errorlist"><li>最小长度为5!</li></ul></li><li>password<ul class="errorlist"><li>最小长度为5!</li></ul></li></ul> <class 'django.forms.utils.ErrorDict'>

        formlogin.errors通过get方法取其错误提示信息。

        问题来了,用户输入的可能不符合规定的条件有好几个,假如由name='xxx'定位的input有三处错误,那么errors里对应对'xxx'后面跟的错误也是三个。需要一次性给用户提示出来吗?

        实际上并不需要如此。取其索引值为0,一次一个的提示用户的错误信息即可。 在前面页面中,渲染时便可实现。通过点号 .  。句点符可以调用属性,key value值,索引。

        

        核心代码

        前端

    <form action="/form_login/" method="post">
        {% csrf_token %}
        <p>姓名:{{ formlogin.username }} <span>{{ error_all.username.0 }}</span></p>
        <p>密码:{{ formlogin.password }} <span>{{ error_all.password.0 }}</span></p>
        <p><input type="submit" value="提交"></p>
    </form>

        视图函数

    def form_login(request):
        if request.method=='POST':
            formlogin=FormLogin(request.POST)
            if formlogin.is_valid():
                print(formlogin.cleaned_data,type(formlogin.cleaned_data))
                return redirect('/index/')
            else:
                error_all=formlogin.errors
                return render(request,'form_login.html',{'error_all':error_all,'formlogin':formlogin})

    五 form组件的进阶

      1 widgets

      官方文档地址:http://python.usyiyi.cn/documents/django_182/ref/forms/widgets.html

      Widget 是Django 对HTML 输入元素的表示。Widget 负责渲染HTML和提取GET/POST 字典中的数据。

      小贴士

      不要将Widget 与表单字段搞混淆。表单字段负责验证输入并直接在模板中使用。Widget 负责渲染网页上HTML 表单的输入元素和提取提交的原始数据。但是,Widget 需要赋值给表单字段。

    from django.forms import widgets

      

      attrs参数

      在真正得网页中,你可能不想让每个Widget 看上去都一样。可以指定‘type’ 属性使用的是新式的HTML5 输入类型。在创建Widget 时使用Widget.attrs 参数可以实现。

    password=forms.CharField(min_length=5, max_length=10, error_messages={'required': '不能为空!', 'min_length': '最小长度为5!',
                                                                             'max_length': '最大长度为10!'},widget=widgets.Textarea(attrs={'style': 'color:red'}))

      其他形式:

        widget=widgets.TextInput(attrs={'class':'form-control'})

        widget=widgets.PasswordInput(attrs={'class':'form-control'})

      2 表单字段   很重要!!

      官方文档地址:http://python.usyiyi.cn/documents/django_182/ref/forms/fields.html

      class Field(**kwargs)

      创建一个表单类时,最重要的部分是定义表单的字段。每个字段都可以有自定义的验证逻辑,以及一些其它的钩子。

      Field.clean(value)

      虽然字段类主要使用在表单类中,但你也可以直接实例化它们来使用,以便更好地了解它们是如何工作的。每个字段实例都有一个clean()方法, 它接受一个参数,然后返回“清洁的”数据或者抛出一个django.forms.ValidationError异常:

    >>> from django import forms
    >>> f = forms.EmailField()
    >>> f.clean('foo@example.com')
    'foo@example.com'
    >>> f.clean('invalid email address')
    Traceback (most recent call last):
    ...
    ValidationError: ['Enter a valid email address.']

       

  • 相关阅读:
    bug、兼容性、适配问题
    关于daterangepicker取消默认值的设置
    重构-改善既有代码设计
    iphoneX 适配
    汇编语言(2)程序表示
    汇编语言(1)基础理论
    css 边框颜色渐变的半圆
    横向时间轴(进度条)
    pdf中内嵌字体问题
    jabRef里引用的相邻同名作者变横线
  • 原文地址:https://www.cnblogs.com/654321cc/p/8038170.html
Copyright © 2011-2022 走看看