Самый чистый способ реализовать несколько почтовых систем в Django? - PullRequest
2 голосов
/ 14 января 2011

Привет всем, я уверен, что это довольно распространенная проблема. Поэтому для того, чтобы зарегистрировать аккаунт моего сайта, вам нужен адрес электронной почты с определенного школьного домена (например, Facebook). Это не будет такой большой проблемой, пока вы не начнете интегрировать другие приложения, такие как django-messages, django-registration и django-socialregistration, в ваш сайт, где они отправляют электронную почту через user.email.

Я спросил своих пользователей, и большинство из них хотят выбрать опцию 'active_email' - это означает, что они могут изменить адрес электронной почты на свой назначенный gmail или любой другой.

Я предложил следующее решение, которое не является самым чистым: Во-первых, я наследую от пользователя в django.contrib.auth и вызываю этот новый класс MultipleEmailUser с email = active_email и official_email = sch_email.

Затем я переопределяю UserManager django.contrib.auth, чтобы немного изменить API, И самая болезненная часть состоит в том, чтобы изменить весь исходный код с User.object.find () на MultipleEmailUser.find ().

Может кто-нибудь предложить мне более чистый путь? (Моя самая большая головная боль возникает из-за того, что другие приложения разрешают отправлять электронную почту только на User.email.)

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Вам не нужно - или вы хотите - изменить класс User. Просто установите класс UserProfile с OneToOneField обратно на User и установите настройку AUTH_PROFILE_MODULE. См. документацию .

0 голосов
/ 14 января 2011

Вместо истинного атрибута хранилища данных вы можете использовать property, называемый «электронная почта», для предоставления доступа к любым данным, которые вы хотите.

Синтаксис базовых свойств (из документов Python ):

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_email и active_email. Затем свойство User.email может выполнять некоторую логику в своей функции получения, чтобы определить, какую из них вернуть (например, , если установлено 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...