【问题标题】:I am confused what form_valid() or form_invalid() accomplished我很困惑 form_valid() 或 form_invalid() 完成了什么
【发布时间】:2019-08-14 21:34:38
【问题描述】:

我刚开始使用基于类的视图而不是函数,如果这是一个显而易见的问题,很抱歉,但是 form_valid()form_invalid() 在继承自 FormView 的类中做了什么? Django 说:

"这个方法在有效的表单数据被 POST 后被调用。它应该 返回HttpResponse"

但我不明白它是如何验证的?在保存数据之前,我需要在表单上执行其他检查(例如在注册时,确保输入的两个密码相同)。如果我愿意,如何添加更多支票?

这是我一直在使用的代码

forms.py

class SignupForm(forms.Form):
    email = forms.EmailField()
    alias = forms.CharField(max_length=15)
    password = forms.CharField(max_length=128, widget=forms.PasswordInput)
    confirm_pass = forms.CharField(max_length=128, widget=forms.PasswordInput)

    # used to verify if the passwords match
    def pwd_match(self):
        if self.is_valid():
            cd = self.cleaned_data
            if cd.get('password') == cd.get('confirm_pass'):
                return True
            else:
                return False

    def fields_correct(self):
        if self.pwd_match() and self.is_valid():
            return True
        return False

views.py

class SignupFormView(AjaxFormMixin, FormView):
    form_class = SignupForm
    template_name = 'forum/signup.html'
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        # here I want to make sure that the passwords match and then save the user

提前谢谢!

【问题讨论】:

标签: django django-forms django-views django-class-based-views


【解决方案1】:

这里有两个选择,

1- 您可以在表单中添加clean 方法,以进行额外的验证。所以在你的表单中,你会有类似的东西,

def clean(self):
    cleaned_data = super().clean()
    # do some validation on your fields
    ...

2- 您可以在视图中的is_valid 函数中添加额外的逻辑,并将用户返回到同一页面并显示错误消息。有点乱,但在某些情况下,你需要修改一下。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    这不是 form_valid 所做的。一旦成功验证表单,就会调用该方法。

    无论你使用基于函数的视图还是基于类的视图,这种东西都属于表单。您应该删除您的 pwd_matchfields_correct 方法,而是定义一个 clean 方法:

    def pwd_match(self):
            cd = self.cleaned_data
            if cd.get('password') != cd.get('confirm_pass'):
                raise forms.ValidationError('passwords do not match')
            return cd
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多