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

  • Post category:Python

Django提供了一个基于class的FormView视图类,用于处理表单数据,其中包含了form_invalid_redirect()函数。

form_invalid_redirect()函数的作用是,当表单数据验证不通过时,跳转到一个指定的url,可以是一个绝对路径或相对路径。

使用方法:

  1. 继承Django的FormView类。

“`python
from django.views.generic.edit import FormView

class MyFormView(FormView):
form_class = MyForm
template_name = ‘my_template.html’
success_url = ‘/success/’
def form_valid(self, form):
# 表单验证通过后的逻辑处理
return super().form_valid(form)
def form_invalid(self, form):
# 表单验证失败后的逻辑处理
return super().form_invalid(form)
def form_invalid_redirect(self):
# 表单验证失败时跳转到指定的url
return ‘/fail/’
“`

  1. 在子类中覆盖form_invalid()函数,然后使用父类的form_invalid()函数来获取表单验证错误的响应。

python
class MyFormView(FormView):
form_class = MyForm
template_name = 'my_template.html'
success_url = '/success/'
def form_valid(self, form):
# 表单验证通过后的逻辑处理
return super().form_valid(form)
def form_invalid(self, form):
response = super().form_invalid(form)
return response
def form_invalid_redirect(self):
# 表单验证失败时跳转到指定的url
return '/fail/'

  1. 在子类中覆盖form_invalid_redirect()函数来指定表单验证失败后跳转的url。

python
class MyFormView(FormView):
form_class = MyForm
template_name = 'my_template.html'
success_url = '/success/'
def form_valid(self, form):
# 表单验证通过后的逻辑处理
return super().form_valid(form)
def form_invalid(self, form):
response = super().form_invalid(form)
return response
def form_invalid_redirect(self):
# 表单验证失败时跳转到指定的url
return '/fail/'

实例1:

假设我们有一个登录表单,用户填写用户名和密码,点击登录按钮后,我们需要先进行表单验证,如果验证通过,则判断用户名和密码是否与数据库保存的值匹配,如果匹配则跳转到主页,否则返回提示信息。

其中,在表单验证失败时,我们需要跳转到登录页面,这时就可以使用form_invalid_redirect()函数。

from django.views.generic.edit import FormView

class LoginView(FormView):
    form_class = LoginForm
    template_name = "login.html"
    success_url = "/"

    def form_valid(self, form):
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user = authenticate(username=username, password=password)
        if user is not None and user.is_active:
            login(self.request, user)
            return super(LoginView, self).form_valid(form)
        else:
            form.add_error(None, "登录失败")
            return super(LoginView, self).form_invalid(form)

    def form_invalid_redirect(self):
        return '/login/'

实例2:

假设我们有一个注册表单,用户填写相关信息后点击注册,如果表单验证不通过,则跳转到注册页面,如果验证通过,则将用户信息保存到数据库中,然后跳转到登录页面,这时就可以使用form_invalid_redirect()函数。

from django.views.generic.edit import FormView

class RegisterView(FormView):
    form_class = RegisterForm
    template_name = "register.html"
    success_url = "/login/"

    def form_valid(self, form):
        user_form = form.save(commit=False)
        user_form.password = make_password(form.cleaned_data["password"])
        user_form.save()
        return super(RegisterView, self).form_valid(form)

    def form_invalid_redirect(self):
        return '/register/'