在Django注册期间强制使用唯一的电子邮件地址

时间:2017-08-16 19:59:33

标签: django

在使用Django构建的网站注册期间,是否有一种简单的方法可以强制使用唯一的电子邮件地址? 我见过一些“插件”?像HMAC一样,但对于我想要实现的目标来说,它看起来有点过于复杂。

此外,是否可以仅从域列表中接受注册? (例如只有来自“@ google.com”的电子邮件)

1 个答案:

答案 0 :(得分:2)

我有同样的问题并通过将AbstractUser类扩展到我自己的类MyUser并更改默认值来解决它。

然后,通过将此类MyUser作为所有用户的默认模型类,我可以将此属性(唯一的电子邮件)应用于我的Web应用程序上的所有用户。

创建应用 myuser 。在models.py中:

from django.contrib.auth.models import AbstractUser

#create your own user class.
class MyUser(AbstractUser):
def __init__(self, *args, **kwargs):
    self._meta.get_field('email').blank = False
    self._meta.get_field('email')._unique = True
    super(MyUser, self).__init__(*args, **kwargs)

#Changed the defaults above.
#Give any additional field you want to associate your user with.

注意:AbstractUser 已经拥有了用户模型所需的所有基本字段。例如:用户名,密码,电子邮件等。检查所有here

您要做的最后一件事是在您的setting.py

中添加以下内容
AUTH_USER_MODEL = 'myuser.MyUser'

这将确保与您的Web应用程序关联的默认用户是扩展(已修改)MyUser类。这将为您提供django为User提供的所有基本功能。

  1. 登录
  2. 注销
  3. 在您的视图中
  4. :您可以在以下位置获取用户实例:request.user
  5. 我想建议你可能需要一些额外的代码(在forms.py和views.py中)来通过这种类创建用户。我希望你能做到这一点。这应该足以引导您朝着正确的方向前进。

    也许图书馆会有所帮助,但由于您需要对电子邮件域名进行身份验证,我认为这应该可以解决问题。在我看来,你不能总是依赖第三方库来获得其他所有功能。

    最后,当您要求对来自@ gmail.com或@ outlook.com 等域的用户进行身份验证时,只需检查django表单中的“干净方法”即可。我希望你知道如何处理django表单。如果没有,那么你可以在官方文档中了解它们。它们是Django的重要组成部分。

    您可以使用以下逻辑检查电子邮件:

    email = self.cleaned_data['email']
    email_source = email.split('@')[-1]
    #email_source will now have values like: gmail.com, outlook.com etc
    #you can now validate email_source now like:
    permitted_sources = ['gmail.com' , 'outlook.com' , ]
    if email_source in permitted_sources:
        return cleaned_data
    else:
        raise forms.ValidationError('Error Message')
    #Note: This logic should be kept in your clean method.
    

    我希望这能指导你。感谢。