django覆盖表单清理方法

django覆盖表单清理方法,django,django-forms,Django,Django Forms,当重写表单清理方法时,如何知道其在任何字段上的验证是否失败?e、 g.在下表中,如果我覆盖了clean方法,我如何知道表单是否在任何字段上未通过验证 class PersonForm(forms.Form): title = Forms.CharField(max_length=100) first_name = Forms.CharField(max_length=100) surname = Forms.CharField(max_length=100) pa

当重写表单清理方法时,如何知道其在任何字段上的验证是否失败?e、 g.在下表中,如果我覆盖了clean方法,我如何知道表单是否在任何字段上未通过验证

class PersonForm(forms.Form):
    title = Forms.CharField(max_length=100)
    first_name = Forms.CharField(max_length=100)
    surname = Forms.CharField(max_length=100)
    password = Forms.CharField(max_length=100)

def clean(self, value):
    cleaned_data = self.cleaned_data

    IF THE FORM HAS FAILED VALIDATION:
        self.data['password'] = 'abc'
        raise forms.ValidationError("You have failed validation!")
    ELSE:
        return cleaned_data 
谢谢

如果您的数据未验证,您的 表单实例将没有 数据属性


使用
self.is\u valid()

def clean(self, value):
    cleaned_data = self.cleaned_data

    if self._errors:
        self.data['password'] = 'abc'
        raise forms.ValidationError("You have failed validation!")
    else:
        return cleaned_data 
奖金!您可以检查特定字段的错误:

def clean(self, value):
    cleaned_data = self.cleaned_data

    if self._errors and 'title' in self._errors:
        raise forms.ValidationError("You call that a title?!")
    else:
        return cleaned_data 

下面是一个简单的例子,它覆盖
django.forms.Form
中的
clean()
,并使用
django大括号
for
AnonymousRequiredMixin
要求只有匿名用户访问浏览页面:

class LoginView(AnonymousRequiredMixin, FormView):
    """
    Main Login. And Social Logins
    """
    template_name = 'core/login.html'
    form_class = LoginForm
    success_url = reverse_lazy('blog:index')

    def get_success_url(self):
        try:
            next = self.request.GET['next']
        except KeyError:
            next = self.success_url
        return next

    def form_valid(self, form):
        cd = form.cleaned_data
        user = auth.authenticate(username=cd['login_username'], 
            password=cd['login_password'])
        if user:
            auth.login(self.request, user)
            messages.info(self.request, 'You are logged in.')
        return super(LoginView, self).form_valid(form)

尽管这是一篇老文章,但如果要对同一表单/模型表单的多个字段应用验证,请使用
clean()
。此方法返回已清理的\u数据字典

要向用户显示错误,可以使用
添加错误(,“您的消息”)
方法。这将在表单顶部显示错误以及字段名。示例如下所示:

add\u error()
自动从已清理的\u数据字典中删除该字段,您不必手动删除它。你也不必导入任何东西来使用它

如果您只想在表单/模型表单的单个字段上进行验证,请使用
clean\(
)。此方法将从已清理的\u数据字典中获取值,然后您可以检查逻辑错误。检查完逻辑后,始终返回该值

def clean_password(self):

  password = self.cleaned_data['password']

  if len(password)<6:
    msg = 'password is too short'
    self.add_error('password', msg)

  return password
def clean_密码(self):
password=self.cleaned_数据['password']

如果len(password)那么我只需检查已清理的数据,例如,如果不是自清理的数据:#执行某些操作否,该属性不存在,您将获得AttributeError。我扩展了我的答案。嗨,马克,我正使用这个过程。然而,验证错误显示在管理(更改表单)页面的顶部,我如何才能在我正在应用验证的字段上方显示错误消息。提前感谢最简单的方法是在字段的
clean\uu
中引发验证错误。请参阅Hi Mark我已经编写了此加薪表单。ValidationError({'Session_type':[“error message”,]})但它在change_表单的顶部向我显示了错误消息。你能告诉我应该修改哪些内容吗?最好将其作为自己的问题而不是评论来询问。
def clean_password(self):

  password = self.cleaned_data['password']

  if len(password)<6:
    msg = 'password is too short'
    self.add_error('password', msg)

  return password