2017-10-07 2 views
0

Ich habe ein Setup benutzerdefinierte wie folgt aus:Identifizieren Typ angemeldeten Benutzer von

class CustomUser(AbstractUser): 
    pass 

class Employee(CustomUser): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    # other fields 

In settings.py ich den folgenden Schlüssel dann hinzu:

AUTH_USER_MODEL = 'myapp.CustomUser' 

ich identifizieren möchten, die angemeldet umleiten sie zu geeigneten Ansichten oder URLs.

In meinem Konto Aktivierung Ansicht, nach ihnen die Anmeldung ich sie auf ihre entsprechenden Seite wie diese

if hasattr(user, 'employee'): 
    return redirect('edit_employee', slug=user.employee.slug) 
else: 
    return redirect('index') 

umleiten Aber das hat nicht das Gefühl, dass Recht, wie ich brauche diese wie zeigt, in anderen Orten zu verwenden, ein anderer Profilseitenlink in den Vorlagen.

Wie kann ich den normalen Benutzer und Mitarbeiter in Sichten und Vorlagen besser identifizieren?

Antwort

1

AFAIK sollten Sie nicht verschiedene Arten von Benutzern in verschiedenen Tabellen speichern. Es wird Ihnen das Leben schwer machen, wenn Sie Beziehungen zwischen anderen Modellen und Ihrem Benutzermodell definieren.

Mein vorgeschlagener Ansatz würde verschiedene profile Modelle für verschiedene Arten von Benutzern haben und eine generische FK oder eine andere Art von ähnlichen Ansätzen verwenden, um den Benutzertyp herauszufinden und ihr Profil zu erhalten.

class CustomUser(AbstractUser): 
    USER_TYPE_EMPLOYEE = 'employee' 
    USER_TYPES = (
      (USER_TYPE_EMPLOYEE, _('Employee')), 
    ) 

    user_type = models.CharField(max_length=max(map(len, map(operator.itemgetter(0), CustomUser.USER_TYPES))), choices=CustomUser.USER_TPYES) 

    @property 
    def profile_model(self): 
     return { 
       USER_TYPE_EMPLOYEE: EmployeeProfile 
     }[self.user_type] 

    @property 
    def profile(self): 
     return self.profile_model.objects.get_or_create(user_id=self.pk) 


class EmployeeProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='employee_profile') 
+0

Ich gebe zu, es hat mich irgendwann gebraucht, um Ihren Ansatz zu verstehen. Ich bin bereit, dies zu tun, aber könnten Sie mich bitte auf eine vollständige Lösung mit diesem Ansatz hinweisen? – Animesh

+1

@Animesh Der Code, den ich zur Verfügung gestellt habe, ist ein Ersatz für die Verwendung eines generischen FK und ist voll funktionsfähig. Wenn Sie neue Profilmodelle hinzufügen möchten, sollten Sie 1. ein neues Modell wie "EmployeeProfile" oben erstellen, 2. den neuen Benutzertyp in 'USER_TYPES' hinzufügen 3. ein Item im Wörterbuch hinzufügen, das von der Methode' profile_model' zurückgegeben wird dein neues Profilmodell. –

+0

Danke für die Richtung, ich werde das untersuchen. – Animesh

1

Die Idee, das Benutzermodell zu erweitern, um ein Mitarbeitermodell zu erstellen, erscheint mir nicht gut. Stattdessen können Sie Django Group Model verwenden und den Benutzer der Mitarbeitergruppe hinzufügen. Auf diese Weise können Sie leicht überprüfen, ob ein Benutzer zur Mitarbeitergruppe gehört oder nicht.

Zusätzlich können Sie hier auch django permissions verwenden. Weisen Sie Ihre benutzerdefinierten Berechtigungen der Mitarbeitergruppe zu und beschränken Sie andere Benutzer auf die Anzeige von Mitarbeiterseiten.

Verwandte Themen