我一直在试图弄清楚所有这些验证是如何工作的,但我并没有得到它的支持。我在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
所以重点是我缺少概念 - 应该在哪里提出验证错误,视图或表单?它被提升到哪里?谁抓住了它?需要在每个文件中导入的内容等。
这应该不会太难,但我现在完全迷失了,我没有例子可以分析和修改我的代码来工作,所以我在这里。
答案 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