2011-01-14 4 views
2

Hey alle, ich bin ziemlich sicher, dass dies ein ziemlich häufiges Problem ist. Also, um ein Konto auf meiner Website zu registrieren, benötigen Sie eine E-Mail-Adresse aus bestimmten Schul-Domäne (wie Facebook). Das wäre kein so großes Problem, bis Sie anfangen, andere Apps, wie Django-Benachrichtigung und Django-Registrierung und Django-Socialregistration, in Ihre Site zu integrieren, wo sie E-Mails über user.email senden.Sauberste Möglichkeit, mehrere E-Mail-System in Django zu implementieren?

Ich habe meine Benutzer gefragt, und die meisten von ihnen wollen eine "active_email" -Option - das bedeutet, dass sie die E-Mail an ihre vorgesehene Gmail oder was auch immer ändern können.

Ich habe mit der folgenden Lösung zu kommen, die nicht das sauberste von allen ist: Zuerst erbe ich von Benutzern in django.contrib.auth und rufen Sie diese neue Klasse MultipleEmailUser, mit email = active_email und official_email = sch_email.

Dann überschreibe ich django.contrib.auth UserManager, um die API leicht zu ändern, Und der schmerzhafteste Teil ist, den gesamten Quellcode zu ändern, der User.object.find() zu MultipleEmailUser.find() hat.

Kann mir jemand einen saubereren Weg vorschlagen? (Mein größter Kopfschmerz entsteht durch andere Apps, die nur das Senden von E-Mails an User.email erlauben.)

Antwort

3

Sie brauchen nicht - oder wollen - die Benutzerklasse zu ändern. Richten Sie einfach eine UserProfile-Klasse mit OneToOneField zurück auf Benutzer ein und legen Sie die AUTH_PROFILE_MODULE Einstellung fest. Siehe the documentation.

+0

Nachdem ich das weiter erforscht habe, glaube ich, dass Sie völlig richtig sind. Django Puristen werden definitiv diesen Rat beherzigen und meinen ignorieren! –

0

Anstatt eines echten Datenspeicherattributs könnten Sie eine property namens "E-Mail" verwenden, um den Zugriff auf beliebige Daten freizugeben.

Grund Eigenschaft Syntax (vom 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.") 

In Ihrem Fall könnten Sie einen echten Datenspeicher Attribute erstellen benannt, zum Beispiel, auth_email und active_email. Dann könnte die User.email Eigenschaft eine gewisse Logik in seiner Getter Funktion ausführen, zu bestimmen, welche zurückkehren (dh wenn active_email gesetzt ist, zurückzukehren, andernfalls Rückkehr auth_email)

Es ist erwähnenswert, dass die Syntax für property hat einen gewissen Fluss erfahren. Ab Python 2.7, kann es in einer besser lesbaren Art und Weise implementiert wird, als Dekorateur:

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

Nun, wenn ich das tue, wie soll ich das machen? Soll ich Benutzer in eine andere Klasse (d. H. MultipleEmailUser) ableiten und diese Eigenschaft implementieren? Führt mich das nicht zurück auf Platz eins, wo ich zu all meinen Plugins gehen und den User zu MultipleEmailUser wechseln muss? – disappearedng

+0

Es führt Sie nicht zu Platz eins, weil vermutlich alle Ihre Plugins auf den Benutzer über 'user.email' zugreifen, was in meinem obigen Code eine Funktion ausführen würde. Eine Python-Eigenschaft ist im Wesentlichen ein Attribut, dessen get/set/delete-Operationen benutzerdefinierten Code durchlaufen, den Sie nach Ihren Wünschen anpassen können. –

Verwandte Themen