关键词

详解Django的 form_invalid_redirect() 函数:返回表单验证失败后的重定向 URL

form_invalid_redirect() 函数是 Django 中 FormMixin 提供的方法,它可以指定在表单验证失败后,应该跳转到哪个页面。

在默认情况下,表单验证失败后,Django 会直接返回原页面,并在页面上呈现错误信息。但是在某些情况下,我们可能需要在表单验证失败后,跳转到指定的页面,或者在跳转到原页面时不呈现错误信息。这时候就需要使用 form_invalid_redirect() 函数了。

form_invalid_redirect() 函数的使用方法非常简单,只需要在视图中定义一个 get_form_invalid_redirect() 函数,该函数返回应该跳转的页面的 URL 即可。如果你希望在跳转后不展示错误信息,可以通过重写 get_context_data() 函数,在上下文中删除 'form' 变量。

下面提供两个示例:

示例一

假设我们有一个文章发布页面,页面包含一个 ArticleForm 表单,用户在表单中填写完毕后点击发布按钮。如果表单验证失败,我们希望跳转到文章列表页面,并在列表页面中展示错误信息。

首先,我们需要在视图中定义一个 get_form_invalid_redirect() 函数,该函数返回文章列表页面的 URL。具体操作如下:

class ArticleCreateView(CreateView):
    template_name = 'article_create.html'
    form_class = ArticleForm

    def get_success_url(self):
        return reverse('article_list')

    def get_form_invalid_redirect(self):
        return reverse('article_list')

然后在文章列表页面中展示错误信息的代码如下:

{% if form.errors %}
<div class="alert alert-danger">
    <strong>错误</strong>
    <ul>
        {% for field, errors in form.errors.items %}
            {% for error in errors %}
                <li>{{ error }}</li>
            {% endfor %}
        {% endfor %}
    </ul>
</div>
{% endif %}

示例二

假设我们有一个评论系统,页面包含一个 CommentForm 表单,用户在表单中填写完毕后点击提交评论按钮。如果表单验证失败,我们希望跳转到原页面,但不展示错误信息。

首先,我们需要在视图中定义一个 get_form_invalid_redirect() 函数,该函数返回当前页面的 URL。具体操作如下:

class CommentCreateView(CreateView):
    template_name = 'comment_create.html'
    form_class = CommentForm

    def get_success_url(self):
        return reverse('comment_list')

    def get_form_invalid_redirect(self):
        return self.request.path

然后在视图中重写 get_context_data() 函数,将 'form' 变量删除。具体代码如下:

class CommentCreateView(CreateView):
    template_name = 'comment_create.html'
    form_class = CommentForm

    def get_success_url(self):
        return reverse('comment_list')

    def get_form_invalid_redirect(self):
        return self.request.path

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        del context['form']
        return context

这样在表单验证失败后,页面会跳转到原页面,但是不会展示错误信息。

本文链接:http://task.lmcjl.com/news/16202.html

展开阅读全文