在django中实施多个电子邮件系统最干净的方法?

时间:2011-01-14 07:37:17

标签: django email

嘿大家,我很确定这是一个相当普遍的问题。 因此,为了在我的网站上注册一个帐户,您需要一个学校域名(如Facebook)的电子邮件地址。在您开始将其他应用程序(例如django-notification和django-registration以及django-socialregistration)集成到您通过user.email发送电子邮件的网站之前,这不是一个大问题。

我问过我的用户,他们中的大多数都想要'active_email'选项 - 这意味着他们可以将电子邮件更改为指定的Gmail或其他任何内容。

我已经提出以下解决方案,这不是最干净的: 首先,我从django.contrib.auth中的User继承并使用email = active_email和official_email = sch_email调用这个新类MultipleEmailUser。

然后我重写django.contrib.auth的UserManager来稍微改变API, 最痛苦的部分是将User.object.find()的所有源代码更改为MultipleEmailUser.find()。

有人可以建议我更干净吗? (我最担心的是其他应用只允许向User.email发送电子邮件。)

2 个答案:

答案 0 :(得分:3)

您不需要 - 或想要 - 修改User类。只需将OneToOneField的UserProfile类设置回用户,然后设置AUTH_PROFILE_MODULE设置即可。请参阅the documentation

答案 1 :(得分:0)

您可以使用名为“email”的property公开访问您想要的任何数据,而不是真正的数据存储属性。

基本属性语法(来自python docs):

class C(object):
    def __init__(self):
        self._x = None

    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")

在您的情况下,您可以创建名为auth_emailactive_email的真实数据存储区属性。然后,User.email属性可以在其getter函数中执行一些逻辑,以确定返回哪一个(即如果设置active_email,则返回它;否则,返回auth_email

值得注意的是property的语法经历了一些变化。从python 2.7开始,它可以以更易读的方式实现,作为装饰器:

class User(BaseModel):
  @property # email
  def email(self):
    if self.active_email:
      return self.active_email
    return self.auth_email