Django验证表单的问题

时间:2011-05-09 15:51:28

标签: django django-forms django-validation

我一直在试图弄清楚所有这些验证是如何工作的,但我并没有得到它的支持。我在djangoproject上阅读了很少的例子,但是我缺少概念以及所有内容是如何捆绑在一起的。

如果可以请查看我的代码并重新排列应该是什么,以及一些解释,这将是非常棒的!

所以我想做一些非常简单的事情:只能通过电子邮件登录。当用户键入他们的电子邮件时,我想检查它是否在数据库中,如果是,请登录。如果不是,我想提出错误'用户已经在数据库'并建议此人去/注册

所以我现在拥有的是:

view.py:

def emailLogin(request, backend, extra_context=None, initial={}):

form = EmailLoginForm(initial=initial)
if request.method == 'POST':
    form = EmailLoginForm(initial=initial, data=request.POST)
    if form.is_valid():
        user = form.do_save()

        _no_pass_login(request, user) # my custom login
        return redirect('/')

    else:
        print ('not valid')

return render_jinja(request, 'registration/email_login_form.html',
        type="register",
        form = form
        )

forms.py

class EmailLoginForm(forms.Form):
    email = forms.EmailField()
    def do_save(self):
    try:
            u = User.objects.get(email=self.cleaned_data['email'])
        except :
            raise forms.ValidationError("Already in DB")

        return u

所以重点是我缺少概念 - 应该在哪里提出验证错误,视图或表单?它被提升到哪里?谁抓住了它?需要在每个文件中导入的内容等。

这应该不会太难,但我现在完全迷失了,我没有例子可以分析和修改我的代码来工作,所以我在这里。

2 个答案:

答案 0 :(得分:1)

是的,你似乎错过了一些概念。

这种形式根本不应该有保存。 is_valid()检查的重点是捕获验证错误 - 因此应该通过该调用引发它们。这样做的方法是在表单上定义clean方法。在这种情况下,由于您只检查email字段,因此您需要定义clean_email方法。代码应与您do_save中的代码相同。

现在,is_valid()将返回False。但是,您的视图中需要进行一些调整才能真正显示错误。首先,将else阻止返回一个缩进级别,使其与if request.method == 'POST'匹配。现在,移动第一行 - print而不是form = EmailLoginForm(initial=initial)语句。现在,当is_valid()为False时,视图将直接进入render_to_response,其中包含验证错误的已实例化表单。魔法!

答案 1 :(得分:1)

我认为这就是丹尼尔所谈论的内容,但如果你不确切知道发生了什么,可能会让人感到困惑。基本上,所有表单都验证您的数据。所有保存都在视图中完成。

view.py

def emailLogin(request, backend, extra_context=None, initial={}):

    form = EmailLoginForm
    if request.method == 'POST':
        form = form(initial=initial, data=request.POST)
        if form.is_valid():
            _no_pass_login(request, user) # my custom login
            return redirect('/')
        else:
            print 'Form not valid'

    else:
        form = form(initial=initial)

return render_jinja(request, 'registration/email_login_form.html',
    type="register",
    form = form
    )

forms.py

class EmailLoginForm(forms.Form):

    email = forms.EmailField()

    def clean_email(self, *args, **kwargs):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).count() > 0:
            raise ValidationError('User with email "%s" already exists' % email)
        return email