【问题标题】:Identify the custom user model in REST_FRAMEWORK settings Django识别 REST_FRAMEWORK 设置 Django 中的自定义用户模型
【发布时间】:2020-11-10 02:23:05
【问题描述】:

我是 Django rest_framework 的新手。我使用自定义用户模型和djoser 作为我的身份验证系统。我想在djoser 注册视图中使用我的自定义用户模型,但我不知道如何在rest_framework 设置中识别它?

settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSIONS_CLASSES':(
        'rest_framework.permissions.IsAuthenticated',
    ),
}

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, phone, password=None):
        if not email:
            raise ValueError("Users must have an email address")
        if not username:
            raise ValueError("Users must have an username")
        if not phone:
            raise ValueError("Users must have a phone number")

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            phone=phone
            )
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_superuser(self,email, username, phone, password):
        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            phone=phone,
            password=password
            )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True

        user.save(using=self._db)
        return user


class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name="email",max_length=60, unique=True)
    username = models.CharField(max_length=60,unique=True)
    phone = models.CharField(max_length=60,unique=True)
    date_joined = models.DateTimeField(verbose_name="date joined",auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last login",auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    first_name = models.CharField(max_length=60,null=True)
    last_name = models.CharField(max_length=60,null=True)
    wilaya = models.CharField(max_length=60,null=True)
    city = models.CharField(max_length=60,null=True)
    address = models.CharField(max_length=200,null=True)
    store_coordinates = models.CharField(max_length=60,null=True)
    documents1 = models.CharField(max_length=60,null=True)
    documents2 = models.CharField(max_length=60,null=True)


    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email','phone']
    

    objects = MyAccountManager()

    def __str__(self):
        return self.username
        
    def has_perm(self, perm, obj=None):
        return self.is_admin
    def has_module_perms(self, app_label):
        return True

我应该添加什么以在djoser 注册视图中使用我的自定义用户模型?

【问题讨论】:

    标签: django-models serialization django-rest-framework django-views django-custom-user


    【解决方案1】:

    您几乎做对了所有事情,但是您需要在设置中告诉 Django 它应该使用什么用户模型。

    models.py 中使用类似的东西

    from django.contrib.auth.models import AbstractUser
    from .managers import UserManager
    
    class User(AbstractUser):
        # Add whatever fields you want
    
        # Use your custom manager
        objects = UserManager()
    

    settings.py

    # Tell Django what user model should be used
    AUTH_USER_MODEL = 'auth.User'  # app_label.model
    

    确保您使用python manage.py makemigrations && python manage.py migrate 来创建您的自定义用户模型。

    享受吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-07
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      相关资源
      最近更新 更多