django基础篇05-Form验证组件

Django的Form主要具有一下几大功能:

  • 生成HTML标签
  • 验证用户数据(显示错误信息)
  • HTML Form提交保留上次提交数据
  • 初始化页面显示内容

基本简单的操作:

from django import forms

class FM(forms.Form):
    # 根据form表单中的name来做
    username = fields.CharField(
        error_messages={'required':'用户名不能为空'},
    )
    pwd = fields.CharField(
        error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'},
        min_length=6,
        max_length=12,
    )
    email = fields.EmailField(
        error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'}
    )
    
Form.py
def index(request):
    if request.method == 'GET':
        # 解决错误提示后内容清空的问题
        obj = FM()
        return render(request,'form_index.html',{'obj': obj})
    elif request.method == 'POST':
        # 获取用户所有数据
        # 每条数据请求验证
        # 成功:获取用户提交的数据
        # 失败:显示错误信息
        obj = FM(request.POST)
        # 验证是否合法
        ret = obj.is_valid()
        if ret:
            print('obj.clean****',obj.clean())
            print('obj.clead_data*****',obj.cleaned_data)
        else:
            print('obj.errors****',obj.errors)
            print('obj.errors.as_json()*****',obj.errors.as_json())
            print('obj****',obj)
            # from django.forms.utils import ErrorDict
            # obj.errors为ErrorDict类型,所以应该按照字典的方法获取值
            print(type(obj.errors))
        return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})
Views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form验证组件</title>
    <style>
        .usernameTF{
            background-color: coral;
            color: aqua;
        }
    </style>
</head>
<body>

    <form action="/form_app/index" method="post">
        {% csrf_token %}    
        <p><input type='text' name='username'/> {{ error_msg.username.0 }}</p>
        <p><input type='text' name='pwd'/>      {{ error_msg.pwd.0 }}</p>
        <p><input type='text' name='email'/>    {{ error_msg.email.0 }}</p>
        <p><input type="submit" value="提交"></p>
    </form>

</body>
</html>
form_index.html

进阶操作:

主要涉及widget的使用、初始化默认值,以及记录上次填写的值

from django import forms
from django.forms import widgets
from django.forms import fields


class FM(forms.Form):
    # 根据form表单中的name来做
    username = fields.CharField(
        error_messages={'required':'用户名不能为空'},
        widget=widgets.Textarea(attrs={'class':'usernameTF'})
    )
    pwd = fields.CharField(
        error_messages={'required':'密码不能为空','min_length':'请填写6位以上密码','max_length':'请填写12位以下密码'},
        min_length=6,
        max_length=12,
        widget=widgets.PasswordInput
    )
    email = fields.EmailField(error_messages={'required':'邮箱不合法','invalid':'邮箱格式不正确'})
Forms
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form验证组件</title>
    <style>
        .usernameTF{
            background-color: coral;
            color: aqua;
        }
    </style>
</head>
<body>

    <form action="/form_app/index" method="post">
        {% csrf_token %}
        <p>{{ obj.username }} {{ error_msg.username.0 }}</p>
        <p>{{ obj.pwd }}      {{ error_msg.pwd.0 }}</p>
        <p>{{ obj.email }}    {{ error_msg.email.0 }}</p>
        <p>{{ obj.user }}</p>
        <p><input type="submit" value="提交"></p>
    </form>

</body>
</html>
form_index.html
def index(request):
    if request.method == 'GET':
        # 加载默认值
        initial_dic = {
            'username': 'root',
            'pwd': '12345678',
            'email': '953995648@qq.com',
            'user': True
        }

        obj = FM(initial_dic)
        return render(request,'form_index.html',{'obj': obj})
    elif request.method == 'POST':
        # 获取用户所有数据
        # 每条数据请求验证
        # 成功:获取用户提交的数据
        # 失败:显示错误信息
        obj = FM(request.POST)
        # 验证是否合法
        ret = obj.is_valid()
        if ret:
            print('obj.clean****',obj.clean())
            print('obj.clead_data*****',obj.cleaned_data)
        else:
            print('obj.errors****',obj.errors)
            print('obj.errors.as_json()*****',obj.errors.as_json())
            print('obj****',obj)
            # from django.forms.utils import ErrorDict
            # obj.errors为ErrorDict类型,所以应该按照字典的方法获取值
            print(type(obj.errors))
        return render(request,'form_index.html',{'obj': obj,'error_msg': obj.errors})
Views.py

在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

方式一:

from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator
 
class MyForm(Form):
 
    user = fields.ChoiceField(
        # choices=((1, '上海'), (2, '北京'),),
        initial=2,
        widget=widgets.Select
    )
 
    def __init__(self, *args, **kwargs):
        super(MyForm,self).__init__(*args, **kwargs)
        # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
        #
        self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

方式二:

使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现

from django import forms
from django.forms import fields
from django.forms import widgets
from django.forms import models as form_model
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
 
class FInfo(forms.Form):
    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())
    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())

 

posted @ 2018-08-03 09:31  土耳其大骗子  阅读(123)  评论(0编辑  收藏  举报