Пользовательская ошибка пользователя Django при регистрации: get_session_auth_hash() отсутствует 1 обязательный позиционный аргумент: 'self' (иначе новый пользователь может войти в систему)

Мне известен этот ответ: TypeError: get_session_auth_hash () отсутствует 1 обязательный позиционный аргумент: 'self', но я не использую пользовательский бэкэнд, и рассматриваемая ошибка возникает при регистрации нового пользователя через форму Django, а не при входе в систему.

Кроме того, несмотря на то, что пользователь не остается в системе при регистрации и не перенаправляется автоматически на главную страницу, как предполагалось, вход в систему из формы входа работает нормально.

Ошибка возникает в этой строке в моем представлении регистрации: login(request, User)

И восходит к этой строке в django.contrib.auth:

    if user is None:
        user = request.user
    if hasattr(user, 'get_session_auth_hash'):
        session_auth_hash = user.get_session_auth_hash() <<<<<<<<< This line

Я думаю, что, поскольку я использую пользовательского пользователя, мне нужно изменить что-то еще в коде по умолчанию, но я не уверен, что это должно быть. Я думаю, что настраиваемая пользовательская модель должна быть взаимозаменяемой с пользовательской моделью по умолчанию, но это не так, и я бы приветствовал кого-то с большим опытом, чем я, который укажет мне правильное направление.

Мой код выглядит следующим образом:

Пользовательская модель пользователя и менеджер в models.py:

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

class UserManager(BaseUserManager):
    def create_user(self, email, password = None, active = True, staff = False, superuser = False):
        if not email:
            raise ValueError('Users must have an email')
        if not password:
            raise ValueError('Users must have a password')
        user = self.model(email = self.normalize_email(email))
        user.set_password(password)
        user.staff = staff
        user.superuser = superuser      
        user.active = active     
        user.save(using=self._db)
        return user

    def create_staffuser(self, email, password = None):
        user = self.create_user(email, password = password, staff = True)
        return user

    def create_superuser(self, email, password = None):
        user = self.create_user(email, password = password, staff = True, superuser = True)
        return user

class User(AbstractBaseUser):
    user_id         = models.AutoField(primary_key=True)
    email           = models.EmailField(max_length = 255, unique =True, default = '[email protected]')
    active          = models.BooleanField(default = True)#can login
    staff           = models.BooleanField(default = False)#staff user non superuser
    superuser       = models.BooleanField(default = False)#superuser
    
    USERNAME_FIELD = 'email' #to set username
    #username and passwor fields are required by default
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return (str(self.user_id) + ' ' + ' ' + self.email)

    def has_perm(self, perm, obj=None):
        return self.superuser

    def has_module_perms(self, app_label):
        return self.superuser

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_superuser(self):
        return self.superuser
    

    @property
    def is_active(self):
        return self.active

Вид регистрации в views.py:

from .models import User
from .forms import NewUserForm

def register_request(request):
    if request.method == "POST":
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, User)
            messages.success(request, "Registration successful." )
            return redirect("main:homepage")
        messages.error(request, "Unsuccessful registration. Invalid information.")
    form = NewUserForm()
    return render (request=request, template_name="main/register.html", context={"register_form":form})

forms.py

from django.contrib.auth.forms import UserCreationForm
from .models import User

class NewUserForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ("email", "password1", "password2")

    def save(self, commit=True):
        user = super(NewUserForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        if commit:
            user.save()
        return user

Пожалуйста, скажите мне, если есть что-то еще, что вам нужно увидеть. Пожалуйста, простите меня, если на этот вопрос есть ответ где-то здесь, но я посмотрел, и не только по ссылке выше! Заранее спасибо.

Примечание. Пробовал заменить

from .models import User

с:

from django.contrib.auth import get_user_model 
User = get_user_model()

во всех модулях, использующих пользовательскую модель. Та же ошибка возникает в тех же местах.


person justajolt    schedule 21.07.2021    source источник


Ответы (2)


У вас опечатка в login. Вы используете User, который является классом вместо user:

login(request, User) # --> should be login(request, user)
person bdbd    schedule 23.07.2021

Ваш код выглядит нормально. Возможно, одно изменение может решить вашу проблему:

Изменить эту строку

from .models import User

To

from django.contrib.auth import get_user_model 
User = get_user_model()
person Reza Heydari    schedule 21.07.2021
comment
Я проголосовал за ваш ответ, потому что он был хорошим. Я уже использовал этот подход в admin. Однако я все еще получаю ту же ошибку, выброшенную из того же места, что и раньше! - person justajolt; 22.07.2021
comment
Попробуйте использовать from django.contrib.auth.hashers import make_password вместо set_password - person Reza Heydari; 22.07.2021
comment
До сих пор нет радости, но продолжайте поступать предложения. - person justajolt; 22.07.2021
comment
Другое дело, изменить импорт на from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager - person Reza Heydari; 22.07.2021
comment
До сих пор нет радости! Это странный... - person justajolt; 23.07.2021