简体   繁体   English

如何在 Django 中将自定义字段添加到 UserManager

[英]How do i add custom fields to UserManager in Django

I am trying to create a user profile, i followed through a tutorial which has registration for only username, email and password but i want to be able to add other custom fields.我正在尝试创建一个用户配置文件,我遵循了一个教程,该教程仅注册了用户名、电子邮件和密码,但我希望能够添加其他自定义字段。

What i did:我做了什么:

Models.py:模型.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

Serializers.py:序列化器.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)

Views.py:视图.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)

URL Path:网址路径:

path('register/', RegisterView.as_view(), name="register" )

When i do this and try to test i get the error, ' UserManager.create_user() got an unexpected keyword argument 'name' '当我这样做并尝试测试时,我得到了错误,' UserManager.create_user() got an unexpected keyword argument 'name' '

Please kindly help as i am new to django rest frameworrk.请帮忙,因为我是 django rest 框架的新手。

In your serializers.py you have the fields list that includes the variable 'name', but it is never defined in the models.py在您的 serializers.py 中,您有包含变量“名称”的字段列表,但它从未在 models.py 中定义

Try to change serializers.py尝试更改 serializers.py

 fields=['email','username','password','address','customerId', 
                  'dso', 'roleId']

And modify the variable name in models.py to be username instead of name并将models.py中的变量名修改为username而不是name

 username = models.CharField(max_length=70, blank=False, default='') 

Based on my experience with Django having a Model called "user" is going to create problems at some point since Django already have a User model pre-installed in the backend.根据我对 Django 的经验,拥有一个名为“user”的模型会在某些时候产生问题,因为 Django 已经在后端预装了一个用户模型。

I know this is not the exact answer you were looking for, this will probably spare you a headache in the future.我知道这不是您正在寻找的确切答案,这可能会让您在未来感到头疼。

To create a user profile I created the following model linking the User model with a OneToOneField.为了创建用户配置文件,我创建了以下模型,将用户模型与 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)

and obvioulsy imported并且很明显是进口的

from django.contrib.auth.models import User

As a result,因此,

  1. I would remove your User model我会删除你的用户模型

  2. Import "from django.contrib.auth.models import User"导入“从 django.contrib.auth.models 导入用户”

  3. add to the first line of your UserManager Model, I would add添加到您的 UserManager 模型的第一行,我会添加

    "user = models.OneToOneField(User, null=True, on_delete=models.CASCADE) “用户 = models.OneToOneField(用户,null=True,on_delete=models.CASCADE)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM