[英]How do i add custom fields to UserManager in Django
我正在尝试创建一个用户配置文件,我遵循了一个教程,该教程仅注册了用户名、电子邮件和密码,但我希望能够添加其他自定义字段。
我做了什么:
模型.py:
class UserManager(BaseUserManager):
def create_user(self, username, email, password=None,):
if username is None:
raise TypeError('User should have a userame')
if email is None:
raise TypeError('Users should have a Email')
user = self.model(username=username , email = self.normalize_email(email))
user.set_password(password)
user.save()
return user
def create_superuser(self, username, email, password=None):
if password is None:
raise TypeError('User should have a password')
user=self.create_user(username,email,password)
user.is_superuser = True
user.is_staff = True
user.save()
return user
class User(models.Model):
dso = models.ForeignKey(Dso,related_name='dso',default=NULL,blank=False,on_delete=models.CASCADE)
name = models.CharField(max_length=70, blank=False, default='')
email = models.EmailField(max_length=70, blank=False, default='')
password = models.CharField(max_length=70, blank=False, default='')
address = models.CharField(max_length=70, blank=False, default='')
roleId = models.IntegerField(blank=False, default='1')
isActive = models.BooleanField(blank=False, default=True)
customerId = models.CharField(max_length=70, blank=False, default='')
dateJoined = models.DateTimeField(auto_now_add=False, blank=False, default=NULL)
@property
def energy_data(self):
energydata = EnergyData.objects.filter(customerId=self.customerId).first()
return energydata
序列化器.py:
class RegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(max_length = 68, min_length=6, write_only = True)
class Meta:
model=User
fields=['email','username','password','name','address','customerId',
'dso', 'roleId']
def validate(self, attrs):
email = attrs.get('email', '')
username = attrs.get('username', '')
if not len(username) >= 4:
raise serializers.ValidationError('Username must be morethan 4 letters or characters')
return attrs
def create(self, validated_data):
return User.objects.create_user(**validated_data)
视图.py:
class RegisterView(generics.GenericAPIView):
serializer_class= RegisterSerializer
def post(self, request):
user = request.data
serializer = self.serializer_class(data=user)
serializer.is_valid(raise_exception=True)
serializer.save()
user_data = serializer.data
user= User.objects.get(email=user_data['email'])
token = RefreshToken.for_user(user).access_token
current_site = get_current_site(request).domain
relativeLink = reverse('email-verify')
absolute_url = 'http://'+current_site+relativeLink+"?token="+str(token)
email_body= 'Hi '+ user.username + ' Use this link below to verify your email \n'+ absolute_url
data = {'email_subject': 'Verify Your Email', 'email_body': email_body , 'to_email': user.email}
Util.send_email(data)
return Response(user_data, status = status.HTTP_201_CREATED)
网址路径:
path('register/', RegisterView.as_view(), name="register" )
当我这样做并尝试测试时,我得到了错误,' UserManager.create_user() got an unexpected keyword argument 'name' '
请帮忙,因为我是 django rest 框架的新手。
在您的 serializers.py 中,您有包含变量“名称”的字段列表,但它从未在 models.py 中定义
尝试更改 serializers.py
fields=['email','username','password','address','customerId',
'dso', 'roleId']
并将models.py中的变量名修改为username而不是name
username = models.CharField(max_length=70, blank=False, default='')
根据我对 Django 的经验,拥有一个名为“user”的模型会在某些时候产生问题,因为 Django 已经在后端预装了一个用户模型。
我知道这不是您正在寻找的确切答案,这可能会让您在未来感到头疼。
为了创建用户配置文件,我创建了以下模型,将用户模型与 OneToOneField 链接起来。
class Profile(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
bio = models.TextField()
profile_pic = models.ImageField(null=True, blank=True,upload_to="images/")
def __str__(self):
return str(self.user)
并且很明显是进口的
from django.contrib.auth.models import User
因此,
我会删除你的用户模型
导入“从 django.contrib.auth.models 导入用户”
添加到您的 UserManager 模型的第一行,我会添加
“用户 = models.OneToOneField(用户,null=True,on_delete=models.CASCADE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.