簡體   English   中英

如何在 Django 中將自定義字段添加到 UserManager

[英]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

因此,

  1. 我會刪除你的用戶模型

  2. 導入“從 django.contrib.auth.models 導入用戶”

  3. 添加到您的 UserManager 模型的第一行,我會添加

    “用戶 = models.OneToOneField(用戶,null=True,on_delete=models.CASCADE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM