2017-10-01 1 views
0

Ich erstellte eine funktionierende "Einloggen mit Facebook" Setup mit Django-Allauth. Ich möchte jedoch, dass die neuen Benutzerkonten, die allauth erstellt, nicht automatisch aktiviert werden.Manuelle Aktivierung von neuen Benutzerkonten in Django

Grundsätzlich möchte ich alle neuen Konten von den Django Admin-Seiten aktivieren.

Was wäre eine Best-Practice-Lösung?

Dank

+1

Mein besten Rat ist, Benutzer ein benutzerdefiniertes Benutzermodell (siehe Dokumentation) [https://docs.djangoproject.com/en/1.11/topics/auth/customizing/] und die Folgendes (Tutorial) [https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html] könnte helfen, wie es geht. – deaspo

+0

Danke! Links sind gebrochen. Oh ich sehe es die Klammer, danke – Daggepagge

+0

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-e-tend-django-user-model.html – deaspo

Antwort

1

Wie wissen Sie, dass ein Konto aktiviert ist oder nicht? Sie benötigen eine Art von Feld in Ihrem User Modell.

Lassen Sie uns sagen, dass Ihr Feld is_activated genannt wird:

class User(BaseUser): 
    is_activated = models.BooleanField(default=False) 

und das ist es. Der Standardwert dieses Feldes ist False, was bedeutet, dass ein erstellter Benutzer nicht standardmäßig aktiviert ist.

Dann können Sie dieses Feld zur Admin-Seite hinzufügen und es von dort aus wechseln.

Hoffe es hilft!

+0

Vielen Dank! Also muss ich das Benutzermodell, das ich nehme, erweitern. Cool. In meinen Vorlagen verwende ich {% if user.is_authenticated%}. Wie stelle ich sicher, dass "user.is_authenticated" "false" für alle Konten zurückgibt, für die is_activated nicht auf "true" gesetzt ist? Oder sollte ich alle Vorlagen neu schreiben, um auch nach "is_activated" zu suchen? Vielen Dank!! – Daggepagge

+1

@Dagogagage müssen Sie eine benutzerdefinierte Berechtigungsklasse erstellen, in der Sie is_authenticated überschreiben würden. Der einfachste Weg wäre, Ihre if-Anweisungen in diese {% if user.is_authenticated und user.is_activated%} zu ändern. –

1

Ich würde vorschlagen, was folgt, als ich machte cogofly Ich hatte dieses große Problem, wo einige Leute (einige aber einige von ihnen tun) klicken Sie manchmal auf "Einloggen mit Google" und manchmal auf "Einloggen mit Facebook" und Das ist die gleiche Person! Seien Sie also vorsichtig damit und diese Lösung wird Ihnen helfen, ein solches Problem zu vermeiden. Das einzige, an das man sich erinnern sollte: Es gibt nur einen Primärschlüssel für alle sozialen Netzwerke: die E-Mail.

Like it's written in the documentation, ich würde eine OneToOne Verbindung zum User Modell machen. Daraus würde ich dies vorschlagen:

  • genau das Datum der ersten Anmeldung
  • genau das Datum der letzten Anmeldung
  • präzise, ​​wenn das Konto

Wie dies bestätigt wird:

from django.contrib.auth.models import User 

class Person(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    is_activated = models.BooleanField(default=False) 

Und machen Sie eine soziale Login-Modell, wo Sie genau wie der Benutzer lo gged in:

class SocialLogin(BaseModel): 
    S_GOOGLE = 1 
    S_FACEBOOK = 2 

    TAB_S_LOGIN = { 
     S_GOOGLE: _("Google"), 
     S_FACEBOOK: _("Facebook"), 
    } 
    logged_in = models.IntegerField(
     choices=[(a, b) for a, b in list(TAB_S_LOGIN.items())], 
     default=S_GOOGLE) 
    date_first_login = models.DateTimeField(auto_now_add=True, 
              verbose_name=_('First login')) 
    date_last_login = models.DateTimeField(auto_now=True, 
              verbose_name=_('Last login')) 
    person = models.OneToOneField(Person, on_delete=models.CASCADE) 

    def logged_in_desc(self): 
     return SocialLogin.TAB_S_LOGIN[self.logged_in] 

    def __str__(self): 
     return '{}/{}'.format(
      self.logged_in_desc(), 
      description if self.description is not None else '?') 
Verwandte Themen