Djangos benutzerdefiniertes Benutzermodell verwenden (Django1.6)

Ich habe eine Django-App, die ein zusätzliches Feld benötigt (eine vielfache Zuordnung zu einer Buchklasse), und ich habe das getan, indem ich den AbstractUser erweitert habe.

Wenn Sie mit dem Benutzermodell von Django vollkommen zufrieden sind und nur einige zusätzliche Profilinformationen hinzufügen möchten, können Sie einfach django.contrib.auth.models.AbstractUser ableiten und Ihre benutzerdefinierten Profilfelder hinzufügen. Diese Klasse bietet die vollständige Implementierung des Standardbenutzers als ein abstraktes Modell.

class User(AbstractUser):
    entitledBooks = models.ManyToManyField(Book)

I added the model in my settings.py

AUTH_USER_MODEL = 'BookRServer.User'

Aber wie erstelle ich einen Benutzer (programmgesteuert)?

user = User.objects.create_user() funktioniert nicht.

0
Was meinst du mit "geht nicht"? Stack-Spur, bitte? Importieren Sie auch Benutzer von Ihren Modellen? Ich denke, der Vorschlag von Django ist, stattdessen User = get_user_model() zu verwenden.
hinzugefügt der Autor Kimvais, Quelle
Argh .. Ich hätte besser reden sollen. Ich kann einen Benutzer "erstellen", aber ich kann kein "Buch" zu "betitleBooks" hinzufügen. Es heißt "Objektbenutzer hat kein Attribut betiteltBücher". Ich kann nur annehmen, dass es den ursprünglichen Benutzer und nicht meinen benutzerdefinierten Benutzer erstellt.
hinzugefügt der Autor user1349663, Quelle

2 Antworten

Auf einfache und lose gekoppelte Weise können Sie ein Benutzerprofil für One-to-One-Beziehungen erstellen, das Ihre Viele-zu-Viele-Beziehung enthält

class UserProfile(models.Model):
    user = model.OneToOneField(User)
    # your many-to-many field here


# create user
u = User(username="", password="", email="", ...)
u.save()
u.userprofile(your fields..here)
u.userprofile.save()

Dies ist normalerweise in allen Django-Versionen gleich. Was im Grunde django 1.6 veraltet ist, ist die Bereitstellung einer Modellmethode get_profile und einiger relevanter Einstellungen.

Wenn Sie das User -Modell nicht wirklich nach Bedarf aus dem Boden bauen möchten, müssen Sie AUTH_USER_MODEL nicht wirklich verwenden.

Das Ablehnen des Benutzerprofils vom Benutzermodell hilft auch auf lange Sicht

0
hinzugefügt
Ah. Danke, dass Sie mich über AUTH_USER_MODEL informiert haben. Aber da AbstractUser zur Verfügung gestellt wird, würde ich gerne wissen, wie man es benutzt.
hinzugefügt der Autor user1349663, Quelle
Ja, das habe ich verstanden. Aber jetzt, wo ich nicht AbstractBaseUser, sondern AbstractUser verwende, muss ich nicht von Grund auf neu erstellen. Und dennoch erstellt die Benutzererstellung in der üblichen Methode den Standardbenutzer und nicht meinen benutzerdefinierten Benutzer.
hinzugefügt der Autor user1349663, Quelle
beziehen Sie sich auf django docs, das ist dort am besten erklärt.
hinzugefügt der Autor Surya, Quelle
Die Verwendung von AUTH_USER_MODEL setzt voraus, dass Sie das ganze Zeug von Grund auf neu aufbauen und nichts anderes. Es gibt einige kleine Sicherheitsmaßnahmen, auf die sich diese Klassen beziehen .. werfen Sie einen Blick in diesen Code, wenn Sie daraus bauen kratzen
hinzugefügt der Autor Surya, Quelle

Die create_user-Manager-Methode akzeptiert nur drei Argumente: Benutzername, E-Mail-Adresse (optional) und Kennwort (optional).

Sie können dies tun:

bookset=Book.objects.all()
user = User.objects.create_user('testuser',email='[email protected]')
user.entitledBooks=bookset
user.save()
0
hinzugefügt
Ich habe user.entitledBooks.add verwendet, aber ja, ich musste das Benutzerobjekt erstellen und dann die zusätzlichen Felder hinzufügen. Also werde ich diese Antwort akzeptieren.
hinzugefügt der Autor user1349663, Quelle