我使用Django-registration与Django 1.8.15注册用户。我的urls.py
看起来像这样:
from registration.backends.hmac.views import RegistrationView
url(r'^registration/register/$', RegistrationView.as_view(form_class=MyCustomSubscriberForm), name="registration_register"),
这基本上是我提供表格和模板的CBV。 这是以下形式:
class MyCustomSubscriberForm(RegistrationForm):
class Meta:
model = MyCustomSubscriber
fields = ('firstname', 'surname', 'email', )
我的问题是如何处理此CBV中的验证?
目前,例如有人尝试使用已经使用过的电子邮件地址注册Django提供IntegrityError at /registration/register/
...
使用Validators from Django-registrations的最佳方式是什么?例如 - 如何确保具有某个电子邮件的用户已经存在,用户会在模板中收到通知?
如何使用Django-Registration提供的验证器扩展此CBV或在我的代码中处理此错误?
答案 0 :(得分:2)
您需要验证表单中的clean_<field>
方法中的电子邮件,如果它是您可以在模板中呈现的重复电子邮件,则会引发错误。
请从文档中查看此部分:Cleaning a specific field attribute
所以你可以得到类似下面的代码:
def clean_email(self):
data = self.cleaned_data['email']
duplicate_users = User.objects.filter(email=data)
if self.instance.pk is not None: # If you're editing an user, remove him from the duplicated results
duplicate_users = duplicate_users.exclude(pk=self.instance.pk)
if duplicate_users.exists():
raise forms.ValidationError("E-mail is already registered!")
return data
答案 1 :(得分:0)
在仔细研究Django-registration之后,我发现Django-registration已经以其中一种形式实现了这个功能:RegistrationFormUniqueEmail
这是RegistrationForm
的子类。
要使用它,我只需要在我的表单中将其子类化为:
class MyCustomSubscriberForm(RegistrationFormUniqueEmail):
def __init__(self, *args, **kwargs):
super (RegistrationFormUniqueEmail, self).__init__(*args, **kwargs)
class Meta:
model = get_user_model()
fields = ('firstname', 'lastname', 'email')
就是这样 - 表单正在检查提供的电子邮件地址是否唯一。