详解Django的 form_invalid() 函数:当表单验证失败时执行的操作

  • Post category:Python

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()函数的用法及其在实际项目中的应用场景。