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.']

   

原文地址:https://www.cnblogs.com/654321cc/p/8038170.html