2013-06-05 4 views
14

Meine Web-Funktionen zwei Benutzertypen, Client und Professional. Es gibt auch zwei "Hauptmodule", eines für Kunden, um Zeug usw. zu kaufen (die Hauptseite), und das andere für Fachleute, um Operationen zu verwalten. Für Auth, würde ich gerne haben:Mehrere Benutzertypen für Auth in Django

  • Ein einzelnes ‚Zeichen in‘ Form, die anzeigt, ob der Benutzer erkennt, ist ein Client oder ein professionelles und leitet sie an die richtige Modul (Haupt-Website oder Management-Site).
  • Zwei Anmeldeformen, eine für Kunden und andere für Profis. Wahrscheinlich wird die Seite den Benutzer fragen, ob sie sich als Fachmann oder als Kunde registrieren möchte, um den richtigen Registrierungsablauf für jeden Fall auszulösen.
  • Kunden verwenden die 'Hauptseite' und sollten nicht berechtigt sein, die 'Management-Site' zu verwenden.
  • Fachleute verwenden die Verwaltungssite, sollten jedoch nicht berechtigt sein, sich auf der Hauptwebsite anzumelden.
  • Sowohl Profis als auch Kunden als Nutzer registriert, und teilen gemeinsame Felder, wie Benutzername, Telefon, E-Mail, etc ...

Da Django wird mich für die Authentifizierung verwenden, um zwei Modelle nicht zulassen. Ich habe benutzerdefinierte Modell-Unterklasse erstellt AbstractBaseUser und die dient mir als Basis-Auth-Klasse für Client und Professional.

class BaseUser(AbstractBaseUser): 
    ... 

class Client(BaseUser): 
    ... 

class Professional(BaseUser): 
    ... 

Ich habe änderte auch die AUTH_USER_MODEL Einstellung:

AUTH_USER_MODEL = 'myapp.BaseUser' 

ich auch django-allauth aufgenommen haben Benutzer Registrierung und Authentifizierung zu verwalten. Aber jetzt stecke ich fest. Ich habe gerade angefangen mit Django/Python zu spielen und ich bin mir nicht sicher, wie ich das lösen soll.

Es scheint, dass es keinen offiziell empfohlenen Weg dafür gibt (Implementing multiple user types with Django 1.5). Sollte ich mich an den Unterklassenansatz halten, oder sollte ich die OnetoOne-Beziehung machen, auf die in der docs hingewiesen wird?

Sobald ich die Modelle richtig eingerichtet habe, wie soll ich mit den beiden Registrierungsformularen fortfahren? Ist es möglich, dies mit Django-Allauth zu erreichen, oder muss ich es manuell tun?

Soweit ich weiß, wenn ein neuer Benutzer registriert ist, wird ein neuer Basisbenutzer in der Benutzer Tabelle erstellt. Aber da ich Benutzerspezialisierungen (Client oder Professional) erstellen werde, wie soll ich angeben, dass ich auch die kundenbezogenen Daten oder berufsbezogene Daten in der entsprechenden Tabelle erstellen möchte?

Ich bin ziemlich neu in Django, so dass jeder Beratung helfen

Antwort

8

ich die einfachste Art und Weise denken, für Sie zu tun, was Sie sprechen über 3 apps in Ihrem Projekt zu haben sein wird: Ihr Top-Level App, eine "professionelle" App und eine "Client" -App. In der Top-Level-App müssen Sie den Nutzern nur ein Login-Formular und 2 Links geben, einen für die Registrierung als Professional und einen für die Registrierung als Client.

In diesem Fall glaube ich, dass es am einfachsten für Sie sein wird, Djangos eingebautes Permissions-System zu verwenden und jeden Benutzertyp einer entsprechenden Gruppe zuzuweisen (zB Profis und Clients).Sie können einen Dekorator für Ihre Ansichten verwenden, um sicherzustellen, dass nur Mitglieder einer bestimmten Gruppe auf diese Ansicht zugreifen können (da Sie für jede Gruppe zwei separate Apps haben, können Sie allen Ansichten in jedem Bereich einen Dekorator hinzufügen oder Djangos importieren Autorisierungsfunktionen in Ihre URLs.py und überprüfen Sie es dort, obwohl das nicht den Rahmen dieser Antwort ist).

Registrierung ist einfach genug, verwenden Sie Ihre urls.py Datei, um den Benutzer, der sich registrieren möchte, an die richtige App weiterzuleiten. Sobald Sie das getan haben, sollten Sie in der Lage sein, die django-allauth-Registrierung für jede App zu verwenden, so dass Sie zwei verschiedene Arten von Benutzern erstellen können. Stellen Sie sicher, dass Sie dem Register bei der Registrierung die richtige Gruppenmitgliedschaft zuweisen. Wenn Sie die POST-Daten erhalten, würde ich nach der Art des angemeldeten Benutzers suchen und diesen verwenden, um den Benutzer an die richtige URL weiterzuleiten, die mit der Professional- oder Client-App verknüpft ist. Sie können den folgenden Link für eine Idee der Umleitung eines Benutzers nach der Anmeldung sehen.

Django - after login, redirect user to his custom page --> mysite.com/username

+0

Dank, du hast mir große Richtlinien für das Projekt-Layout. Aber was ist mit Modellen? Denken Sie, dass die Erstellung von zwei Professional- und Client-Modellen mit einer OneToOnefield-Verknüpfung zurück zum Benutzermodell in Ordnung ist? Auf diese Weise könnte ich beide Benutzertypen problemlos verwalten. – jaime

+2

Das ist sicherlich eine Option, und es ist nicht unbedingt eine schlechte, es sei denn, Sie möchten skalieren. Die andere Option besteht darin, alle Felder in einem einzelnen Benutzermodell zu erstellen und mithilfe von Modellfunktionen zu definieren, welche Felder für die verschiedenen Benutzerarten gelten. Anstatt Ihre DB-Engine zu definieren, welche Felder nicht Null sein können, oder Grenzwerte oder irgendetwas anderes, können Sie Django dazu bringen, die Integrität zu erzwingen und ein wenig mehr Flexibilität bei den Einträgen zu erhalten, die Sie mit einem einzigen Element erstellen können Modell. –

+0

@TitusP könnte bitte einen Blick auf diese Frage werfen: http://stackoverflow.com/questions/35252375/trouble-verstanding-user-object-in-django?noredirect=1#comment58217925_35252375 – user3497437