2015-10-07 2 views
1

Я изучаю django, пытающийся реализовать пользовательскую модель, но каждый раз, когда я пытаюсь войти в/admin с ней, я получаю два длинных списка следов, которые заканчиваются вТипError: get_session_auth_hash() отсутствует 1 обязательный позиционный аргумент: 'self'

TypeError: get_session_auth_hash() missing 1 required positional argument: 'self' 

и ни одно из отдельных файлов или вызовов в TRACEBACK не один из моих файлов

только в случае, здесь мои модели и движки файлы

models.py

from django.db import models 
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser 

class UserManager(BaseUserManager): 
    """ 
    Custom user manager 
    """ 
    def create_user(self, username, password): 
     if not username or not password: 
      raise ValueError("We need username and password here...") 
     user = self.model(username=username) 
     user.set_password(password) 
     user.save() 
     return user 
    def create_superuser(self, username, password): 
     if not username or not password: 
      raise ValueError("We need username and password here...") 
     user = self.create_user(username=username,password=password) 
     user.set_password(password) 
     user.is_admin = True 
     user.is_staff = True 
     user.save() 
     return user 

class User(AbstractBaseUser): 
    """ 
    Custom user class 
    """ 
    username = models.CharField(max_length=64, unique=True, db_index=True) 
    joined = models.DateTimeField(auto_now_add=True, auto_now=False) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 
    is_admin = models.BooleanField(default=False) 

    objects = UserManager() 

    USERNAME_FIELD = 'username' 

    def __str__(self): 
     return self.username 

Backends.py

from django.contrib.auth.models import check_password 
from accounts.models import User 

class AuthenticationBackend(object): 
    """ 
    Backend for authentication 
    """ 
    def authenticate(self, username=None, password=None): 
     try: 
      user = User.objects.get(username=username) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
       return None 

    def get_user(self, user_id): 
     try: 
      user = User.objects.get(pk=user_id) 
      if user.is_active: 
       return User 
      return None 
     except User.DoesNotExist: 
      return None 

Просьба помочь я теряюсь

ответ

2

В AuthenticationBackend.get_user, у вас есть это:

 if user.is_active: 
      return User 

, который фактически возвращает Userкласс вместо вашего user экземпляр. Затем код, вызывающий этот метод, пытается вызвать get_session_auth_hash() на то, что вы вернули, следовательно, ваша ошибка.

Вы хотите:

 if user.is_active: 
      return user 
+0

Thankyou я знал, что это было что-то маленькое, это просто не обнаруживалось – eatingcereal

+0

Hint # 1: сообщение об ошибке жаловалось отсутствующего 'self' (первый позиционный) паров, которые обычно означает, что кто-то пытался вызвать метод экземпляра для класса. Подсказка №2: в вашем фрагменте «Пользователь» был выделен как класс, который сделал соединение очевидным;) –

Смежные вопросы