2013-05-17 6 views
6

Ich baue eine Webanwendung mit Django 1.5. Ich verwende ein benutzerdefiniertes Benutzermodell mit einem benutzerdefinierten UserManager. Ich folgte den Anweisungen und Beispielen der offiziellen Django-Dokumentation.Django benutzerdefiniertes Benutzermodell und usermanager

Wenn ich jetzt versuche, einen neuen Benutzer über UserManager.create_user(...) zu erstellen, erhalte ich einen NoneType-Fehler: Es scheint, dass die Attributmodelle des UserManagers vom Typ None sind. Ich denke, ich richte den UserManager richtig im Benutzermodell ein (objects = UserManager())

Ich weiß wirklich nicht, wo ich einen Fehler mache. Booth meine Coding-Partner und ich sind neu in Django. Vielleicht kannst du uns helfen. Hier

ist der Code:

class UserManager(BaseUserManager): 
""" 
    create a new user 

    @param username: the name for the new user 
    @param password: the password for the new user. if none is provided a random password is generated 
    @param person: the corresponding person object for this user 
""" 
def create_user(self, username, person, password=None): 
    if not username: 
     raise ValueError('User must have a valid username') 

    user = self.model(username=username, created=datetime.now(), must_change_password=True, deleted=False, person=person) 

    user.set_password(password) 
    user.save(using=self._db) 
    return user 

class User(AbstractBaseUser): 
    ## the id of the user. unique through the application 
    user_id  = models.AutoField(primary_key=True) 
    ## the name of the user. unique through the application 
    username = models.CharField(max_length=32, unique=True) 
    ## the date when the user was created 
    created  = models.DateTimeField() 
    ## iff this is true the user must set a new password at next login 
    must_change_password = models.BooleanField(default=True) 
    ## iff true the user is marked as deleted and can not login 
    deleted  = models.BooleanField(default=False) 
    ## iff true the user is admin and has all permissions. use with care! 
    is_admin = models.BooleanField(default=False) 
    ## reference to the person entity that is linked to this specific user 
    person  = models.ForeignKey(Person) 
    ## indicates if the user is active or not 
    active = models.BooleanField(default=True) 

    ## define the user manager class for User 
    objects  = UserManager() 

    # necessary to use the django authentication framework: this field is used as username 
    USERNAME_FIELD = 'username' 

Ich erhalte die NoneType Fehler in Zeile user = self.model(..) im create_user() -Methode in der Usermanager

Antwort

5

Um neue Benutzer erstellen Sie nicht UserManager.create_user(...) nennen sollte. Stattdessen sollten Sie verwenden:

from django.contrib.auth import get_user_model 
get_user_model().objects.create_user(...) 

So arbeiten Django-Manager. Sie können lesen here

1

Ich musste eine Antwort hinzufügen, da ich nicht genug rep haben, um zu kommentieren. Aber der Link in @ Aldarunds Antwort beschreibt nicht die Verwendung von get_user_model() überhaupt. Allerdings sollte this link helfen ...

3

ich auch Probleme beim Speichern der benutzerdefinierten Benutzermodell hatte und es dauerte, während es auf Figur unserer

Ich denke, die wichtige Linie in Ihrem Code ist:

objects  = UserManager() 

innerhalb der Benutzerklasse, so um den neuen Benutzer Sie

new_user=User.objects.create_user(args, args, args, etc) 

die „objects“ ist das Element aufrufen müssen zu speichern, die dieruftKlasse und heißt Manager in django

+0

Erklären Sie bitte, warum diese Methode schlecht ist, wer die Antwort downvote. – deathangel908

Verwandte Themen