Django中的form_invalid()
函数是在表单验证失败时被调用的方法,用于处理表单验证失败的情况。其主要作用是对表单验证失败后的处理进行自定义。
具体来说,当一个表单提交后出现了错误,即表单验证失败,Django则会自动调用form_invalid()
函数来处理错误。此时我们可以重写该方法来自定义处理错误的方式,比如重新渲染返回到表单页面,并将错误信息显示在页面上。
以下是使用form_invalid()
函数的基本步骤:
1.在视图函数中重写form_invalid()
方法,对表单验证失败的情况进行自定义处理:
from django.views.generic.edit import FormView
class MyFormView(FormView):
form_class = MyForm
template_name = 'form.html'
success_url = '/success/'
# 更新表单验证时调用的方法,表单验证失败则会调用此方法
def form_invalid(self, form):
# 在提交的表单中添加一些自定义错误提示信息
form.add_error('字段名', '错误信息')
# 渲染表单页面并将错误信息传递到表单页面上
return self.render_to_response(self.get_context_data(form=form))
2.在表单页面中显示错误信息。在模板中我们可以使用{{ form.field.errors }}
的方式来显示表单验证发生的错误信息。其中field
是表单的字段名。通常我们在表单页面的表单字段后添加错误信息,如下所示:
<form method="post">
{% csrf_token %}
{{ form.username }}
{{ form.username.errors }}
<br>
{{ form.password }}
{{ form.password.errors }}
<br>
<button type="submit">Submit</button>
</form>
接下来提供两个实例说明form_invalid()
函数的用法:
实例一
假设我们有一个留言板页面,用户可以在上面提交留言信息。但是为了防止用户发表不当言论,我们需要开启内容审查功能,并且对于不合适的留言,需要将其标记为不合适,并提示用户修改。下面是对应的视图函数:
from django.views.generic.edit import FormView
from django.shortcuts import get_object_or_404
from app.forms import MyForm
from app.models import Message
class MessageView(FormView):
form_class = MyForm
template_name = 'message.html'
success_url = '/thanks/'
def form_valid(self, form):
# 取得用户填写的留言信息
message = Message.objects.create(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
content=form.cleaned_data['content'],
)
# 如果留言内容中包含不合适的内容,则拒绝留言
if is_inappropriate(message.content):
# 标记留言为不合适
message.is_inappropriate = True
message.save()
# 返回表单页面,提示用户修改
return self.form_invalid(form)
# 留言合法,跳转到success_url页面
return super().form_valid(form)
在上述代码中,当用户提交留言表单后,如果内容中包含不合适的内容,则会提示用户修改。我们在这里使用了form_invalid()
函数,重新渲染表单页面并在表单中显示错误提示信息。
实例二
假设我们有一个多文件上传功能,用户需要选择并上传多个文件。上传文件的表单项长这样:
class FileUploadForm(forms.Form):
files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
当上传的文件类型不正确时,我们需要在视图函数中进行自定义处理。以下是对应的视图函数:
from django.views.generic.edit import FormView
class FileUploadView(FormView):
form_class = FileUploadForm
template_name = 'upload_files.html'
success_url = '/thanks/'
def form_valid(self, form):
files = self.request.FILES.getlist('files')
for file in files:
if file.content_type != 'image/jpeg':
# 文件类型不正确,提示用户进行修改
form.add_error('files', f"文件 '{file.name}' 类型不正确")
return self.form_invalid(form)
return super().form_valid(form)
在上述代码中,当用户上传的文件类型不正确时,我们会把错误提示信息放入到表单中,并渲染返回到表单页面。
通过以上实例,我们已经详细介绍了Django的form_invalid()
函数的用法及其在实际项目中的应用场景。