注册时 Django 自定义用户错误:get_session_auth_hash() 缺少 1 个必需的位置参数:'self'(否则新用户可以登录)
Django custom user error when registering: get_session_auth_hash() missing 1 required positional argument: 'self' (new user can otherwise log in)
我知道这个答案:,但我没有使用自定义后端,并且在通过 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 = 'abc123@domain.ext')
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
请告诉我您是否还有其他需要查看的内容。如果这个问题在这里的其他地方得到了回答,请原谅我,但我已经看过了,而不仅仅是上面的 link !提前致谢。
注意:
尝试替换
from .models import User
与:
from django.contrib.auth import get_user_model
User = get_user_model()
在所有使用用户模型的模块中。同样的错误发生在同样的位置。
您的代码看起来不错..也许一个更改可以解决您的问题:
更改此行
from .models import User
到
from django.contrib.auth import get_user_model
User = get_user_model()
您在 login
中有错字。您正在使用 User
,即 class 而不是 user
:
login(request, User) # --> should be login(request, user)
我知道这个答案:
此外,虽然用户在注册时没有保持登录状态,也没有按预期自动重定向到主页,但从登录表单登录似乎功能正常。
错误发生在我的注册视图中的这一行: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 = 'abc123@domain.ext')
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
请告诉我您是否还有其他需要查看的内容。如果这个问题在这里的其他地方得到了回答,请原谅我,但我已经看过了,而不仅仅是上面的 link !提前致谢。
注意: 尝试替换
from .models import User
与:
from django.contrib.auth import get_user_model
User = get_user_model()
在所有使用用户模型的模块中。同样的错误发生在同样的位置。
您的代码看起来不错..也许一个更改可以解决您的问题:
更改此行
from .models import User
到
from django.contrib.auth import get_user_model
User = get_user_model()
您在 login
中有错字。您正在使用 User
,即 class 而不是 user
:
login(request, User) # --> should be login(request, user)