Django——表单

Django——表单

  • 概述
  • 验证数据
  • ModelForm
  • 文件上传

一、概述

1.Django中的表单
Django中的表单丰富了传统的HTML语言中的表单。在Django中的表单,主要做以下两件事:

① 渲染表单模板。
② 表单验证数据是否合法。

2.流程
①首先我们在后台服务器定义一个表单类,继承自django.forms.Form

# forms.py
class BlogBoardForm(forms.Form):
    title = forms.CharField(max_length=15,label='标题',min_length=2,error_messages={"min_length":'标题字符段不符合要求!'})
    content = forms.CharField(widget=forms.Textarea,label='内容')
    email = forms.EmailField(label='邮箱')
    reply = forms.BooleanField(required=False,label='回复')

②然后在视图中,根据是GET还是POST请求来做相应的操作。

# views.py
class IndexView(View):
    def get(self,request):
        form = BlogBoardForm()
        return render(request,'index.html',{'form':form})

    def post(self,request):
        form = BlogBoardForm(request.POST)
        if form.is_valid():
            title = form.cleaned_data.get('title')
            content = form.cleaned_data.get('content')
            email = form.cleaned_data.get('email')
            reply = form.cleaned_data.get('reply')
            return HttpResponse('success')
        else:
            print(form.errors)
            return HttpResponse('fail')

③在使用GET请求的时候,我们传了一个form给模板,那么以后模板就可以使用form来生成一个表单的html代码。

<form action="" method="post">
    <table>
      {{form.as_table}}
        <tr>
            <td></td>
            <td><input type="submit" value="提交"></td>
        </tr>
    </table>
</form>

二、验证数据

1.Field
使用Field可以是对数据验证的第一步。你期望这个提交上来的数据是什么类型,那么就使用什么类型的Field。
2.验证器
在验证某个字段的时候,可以传递一个validators参数用来指定验证器,进一步对数据进行过滤。
3.提取错误信息
如果验证失败了,那么有一些错误信息是我们需要传给前端的。这时候我们可以通过以下属性来获取:
① form.errors:这个属性获取的错误信息是一个包含了html标签的错误信息。
②form.errors.get_json_data():这个方法获取到的是一个字典类型的错误信息。将某个字段的名字作为key,错误信息作为值的一个字典。
③ form.as_json():这个方法是将form.get_json_data()返回的字典dump成json格式的字符串,方便进行传输。

三、ModelForm

有时表单中的Field和模型中的Field基本上是一模一样的,而且表单中需要验证的数据,也就是我们模型中需要保存的。那么这时候我们就可以将模型中的字段和表单中的字段进行绑定。

from django.db import models
from django.core import validators
class BlogArticle(models.Model):
    title = models.CharField(max_length=10,validators=[validators.MinLengthValidator(limit_value=3)])
    content = models.TextField()
    author = models.CharField(max_length=100)
    category = models.CharField(max_length=100)
    create_time = models.DateTimeField(auto_now_add=True)

在写表单的时候,就不需要把Article模型中所有的字段都一个个重复写一遍了。

from django import forms
class MyForm(forms.ModelForm):
    class Meta:
        model = BlogArticle
        fields = "__all__"

四、文件上传

1.前端HTML代码实现:

①在前端中,我们需要填入一个form标签,然后在这个form标签中指定enctype=“multipart/form-data”,不然就不能上传文件。
②在form标签中添加一个input标签,然后指定input标签的name,以及type=“file”。

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
</form>

2.后端的代码实现
后端的主要工作是接收文件。然后存储文件。接收文件的方式跟接收POST的方式是一样的,只不过是通过FILES来实现。

def save_file(file):
    with open('somefile.txt','wb') as fp:
        for chunk in file.chunks():
            fp.write(chunk)

def index(request):
    if request.method == 'GET':
        form = MyForm()
        return render(request,'index.html',{'form':form})
    else:
        myfile = request.FILES.get('myfile')
        save_file(myfile)
        return HttpResponse('success')

你可能感兴趣的:(Django,django,python,后端)