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格式的字符串,方便进行传输。
有时表单中的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')