0

我一直试图弄清楚所有这些验证是如何工作的,但我没有掌握它。我阅读了 djangoproject 上的极少数示例,但我缺少概念以及所有内容是如何联系在一起的。

如果你可以请看我的代码并重新安排事情应该是怎样的,以及一些解释,那就太棒了!

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

所以我目前拥有的是:

视图.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
        )

表格.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

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

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

4

2 回答 2

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,其中包含一个包含验证错误的已实例化表单。魔法!

于 2011-05-09T16:23:58.073 回答
1

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

视图.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
    )

表格.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
于 2011-05-09T16:41:04.180 回答