我们已经知道了在Django里面如何从前端向后台发送数据的基本操作。(  )在之前的例子里面,我们的HTML模板里面的form表单都是手动创建的,对于提交的数据类型格式也需要自己写正则表达式进行确认。(例如AJAX的例子  )

如果表单很多的话,手动处理这些东西会很费时间。Django提供了一个form的功能,可以根据我们定义的类,自动生成HTML界面,同时还能对输入的数据自动进行验证,如果失败,可以直接返回错误信息到界面上。

基本操作:

首先需要创建一个form的类,这个里面可以定义字段,每个字段本身只做认证;然后通过字段里的widget这个插件,可以生成对应的HTML和绑定各种style等属性;这样在html界面直接调用对应的`obj`.`id`就行了

直接看个例子说明一下

views.py

######################## Form #####################from django import formsfrom django.forms import widgetsfrom django.forms import fieldsclass FM(forms.Form):    # 字段本身只做验证    # 如果不配置widget插件,默认就是text显示    # label显示名字    user = fields.CharField(        error_messages={'required': '用户名不能为空.'},        label="用户名 ",        )    pwd = fields.CharField(        max_length=12,        min_length=6,        error_messages={'required': '密码不能为空.', 'min_length': '密码长度不能小于6', "max_length": '密码长度不能大于12'},        widget=widgets.PasswordInput(attrs={'class': 'c2'}),        label="密码",    )    email = fields.EmailField(error_messages={'required': '邮箱不能为空.','invalid':"邮箱格式错误"},label='Email')        #上传文件,注意视图函数和form表单中的使用    f = fields.FileField(label='文件')      #单选框    city1 = fields.ChoiceField(        choices=[(0,'上海'),(1,'广州'),(2,'东莞')]    )        #多选框    city2 = fields.MultipleChoiceField(        choices=[(0,'上海'),(1,'广州'),(2,'东莞')]    )    from app01 import modelsdef fm(request):    if request.method == "GET":        # 假设下面的值从数据库中获取到        dic = {            "user": 'r1',            'pwd': '123123',            'email': 'sdfsd@jklsl.com',            'city1': 1,            'city2': [1,2]        }                #通过inital来指定一个字典为初始值,字典的key名字要匹配        obj = FM(initial=dic)        return render(request,'fm.html',{'obj': obj})    elif request.method == "POST":        # 获取用户所有数据        # 每条数据请求的验证        # 成功:获取所有的正确的信息        # 失败:显示错误信息                #如果没有上传文件的话,可以直接使用 obj=FM(request.POST)        obj = FM(request.POST,request.FILES)        r1 = obj.is_valid()        if r1:            # obj.cleaned_data是正确的提交结果            print(obj.cleaned_data)                        #下列代码是上传一个文件            import os            print(request.FILES['f'])            name=request.FILES['f']            file_path = os.path.join('upload',str(name) )            print(file_path)            f = open(file_path, mode="wb")            for i in request.FILES['f'].chunks():                f.write(i)            f.close()            from django.core.files.uploadedfile import InMemoryUploadedFile            #如果需要创建数据,可以直接传入            # models.UserInf.objects.create(**obj.cleaned_data)        else:            # ErrorDict,显示错误信息。因为错误信息是字典格式,所以可以通过as_json显示            print(obj.errors.as_json())            #具体的错误信息            # print(obj.errors['email'][0])            return render(request,'fm.html', {'obj': obj})        return render(request,'fm.html')

fm.html

    
    
    
        {% csrf_token %}        

{

{ obj.user.label }} {
{ obj.user }} 
{
{ obj.errors.user.0 }}

        

{

{ obj.pwd.label }}{
{ obj.pwd }}  
{
{ obj.errors.pwd.0 }}

        

{

{ obj.email.label }}{
{ obj.email }} 
{
{ obj.errors.email.0 }}

        

{

{ obj.f.label }}{
{ obj.f }} 
{
{ obj.errors.f.0 }}

        {
{ obj.city1 }}        {
{ obj.city2 }}        
    

控制台输出效果

{"email": [{"message": "\u90ae\u7bb1\u683c\u5f0f\u9519\u8bef", "code": "invalid"}]}{"pwd": [{"message": "\u5bc6\u7801\u957f\u5ea6\u4e0d\u80fd\u5c0f\u4e8e6", "code": "min_length"}]}

浏览器效果如下:(浏览器会自动生成一堆验证效果,不同的浏览器效果还不一样)

上传的结果

具体的语法可以参考