[英]Why is there a difference between creating superuser and signing up to create user in django?
我正在使用 django 自定義用戶 model 和自定義寄存器序列化程序來實現成員資格。 但是當我完成實現並測試它時,出現了一點問題,所以我想問一下。 它是我從控制台 python manage.py,和當我運行命令 createsuperuser 注冊時以會員身份訪問的結果頁面。 這里有一些圖片。
如果我這樣注冊,
密碼沒有被pbkdf2_sha256方法加密,用戶名什么都沒有,配置文件有default_image
但是,在控制台中作為命令創建的超級用戶不僅正常輸入用戶名和配置文件圖像,而且密碼通常在 pbkdf2_sha256 方法中加密。 我希望加入注冊頁面的用戶是普通用戶名和個人資料,如超級用戶,加密相同。 如何修改我的代碼? 這是我的代碼。
模型.py
from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, email, profile, userName, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
userName=userName,
profile=profile,
)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, userName, profile):
user = self.create_user(
email=self.normalize_email(email),
password=password,
userName=userName,
profile=profile,
)
user.is_staff = True
user.is_superuser = True
user.set_password(password)
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
password = models.CharField(max_length=16)
userName = models.CharField(max_length=10)
profile = models.ImageField(default='default_image.jpeg')
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
序列化程序.py
from .models import User
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer
from rest_framework_simplejwt.tokens import RefreshToken
from allauth.account import app_settings as allauth_settings
from allauth.utils import email_address_exists
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
from django.utils.translation import ugettext_lazy as _
from datetime import datetime, timedelta
class customRegisterSerializer (serializers.Serializer) :
email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
password = serializers.CharField(required=True, write_only=True)
userName = serializers.CharField(required=True)
profile = serializers.ImageField(use_url=True)
def validate_email(self, email):
email = get_adapter().clean_email(email)
if allauth_settings.UNIQUE_EMAIL:
if email and email_address_exists(email):
raise serializers.ValidationError(
_("A user is already registered with this e-mail address."))
return email
def validate_password (self, password):
return get_adapter().clean_password(password)
def get_cleaned_data(self):
return {
'email': self.validated_data.get('email', ''),
'password': self.validated_data.get('password', ''),
'userName': self.validated_data.get('userName', ''),
'profile' : self.validated_data.get('profile', ''),
}
def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()
user.set_password(self.cleaned_data.get('password'))
adapter.save_user(request, user, self)
setup_user_email(request, user, [])
user.save()
return user
class customTokenObtainPairSerializer (TokenObtainPairSerializer) :
def validate (self, attrs) :
data = super().validate(attrs)
refresh = self.get_token(self.user)
del(data['refresh'])
del(data['access'])
data['token_type'] = 'bearer'
data['access_token'] = str(refresh.access_token)
data['expires_at'] = str(datetime.now() + timedelta(hours=6))
data['refresh_token'] = str(refresh)
data['refresh_token_expires_at'] = str(datetime.now() + timedelta(days=30))
return data
class customTokenRefreshSerializer (TokenRefreshSerializer) :
def validate (self, attrs) :
data = super().validate(attrs)
refresh = RefreshToken(attrs['refresh'])
data['token_type'] = 'bearer'
data['access_token'] = str(refresh.access_token)
data['expires_at'] = str(datetime.now() + timedelta(hours=6))
data['refresh_token'] = str(refresh)
data['refresh_token_expires_at'] = str(datetime.now() + timedelta(days=30))
del(data['access'])
return data
class userProfileSerializer (serializers.ModelSerializer) :
profile = serializers.ImageField(use_url=True)
class Meta :
field = ('email', 'userName', 'profile')
我也遇到了這個錯誤,發現由於模板中的名稱不匹配,查看它返回 None
create_user 為 None 設置密碼 跟蹤您的代碼 **所以在我的情況下它得到了解決 **
在你的情況下使用:
def create_user(self, email, profile, userName, password):
email=self.normalize_email(email),
*user = self.model(email=email, **extra_fields)*
userName=userName,
profile=profile,
user.set_password(password)
user.save()
return user
代替
def create_user(self, email, profile, userName, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
userName=userName,
profile=profile,
)
user.set_password(password)
user.save()
return user
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.