Django Rest Framework注册 [英] Django Rest Framework registrations

查看:327
本文介绍了Django Rest Framework注册的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义用户模型

I have a custom user model

class User(AbstractUser):

    username = None    
    email = models.EmailField( unique=True)    
    phone = models.CharField( max_length=15) 
    is_pro = models.BooleanField(default=False)    

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

    objects = UserManager()

    @property
    def token(self):
    """
    Allows us to get a user's token by calling `user.token` instead of
        `user.generate_jwt_token().

    The `@property` decorator above makes this possible. `token` is called
    a "dynamic property".
    """
        return self._generate_jwt_token()

    def _generate_jwt_token(self):
        """
        Generates a JSON Web Token that stores this user's ID and has an expiry
        date set to 60 days into the future.
        """
        import jwt
        from datetime import datetime, timedelta
        from django.conf import settings
        dt = datetime.now() + timedelta(days=60)

        token = jwt.encode({
            'id': self.pk,
            'exp': int(dt.strftime('%s'))
        }, settings.SECRET_KEY, algorithm='HS256')

        return token.decode('utf-8')

现在我尝试进行登录使用本教程的Django Rest Framework API https://thinkster.io/tutorials/django- json-api / authentication

Now I try make SignIn API with Django Rest Framework using this tutorial https://thinkster.io/tutorials/django-json-api/authentication

serializer.py

class RegistrationSerializer(serializers.ModelSerializer):

    password = serializers.CharField(
        max_length=128,
        min_length=8,
        write_only=True
    )


    token = serializers.CharField(max_length=255, read_only=True)

    class Meta:
        model = User

        fields = ['email', 'phone', 'password', 'token']

    def create(self, validated_data):
        # Use the `create_user` method we wrote earlier to create a new user.
        return User.objects.create_user(**validated_data)

views.py

class RegistrationAPIView(APIView):
    # Allow any user (authenticated or not) to hit this endpoint.
    permission_classes = (AllowAny,)    
    serializer_class = RegistrationSerializer

    def post(self, request):
        user = request.data.get('user', {})

        serializer = self.serializer_class(data=user)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

然后我创建了一个新用户,发生了错误这是必填栏。我所有的用户字段,例如电子邮件,电话,密码。
屏幕快照图片 http://joxi.ru/12MOMkZt4eeBEr

Then I create a new user an error occured "This field is required." for all my User fields, like email, phone, password. Screenshot picture http://joxi.ru/12MOMkZt4eeBEr

推荐答案

这是因为您在 User 模型中将此字段设置为不可为空且必填。要修复此问题,您可以添加 blank = True 可能为空的字段的参数,例如 phone

This is because you set this fields not nullable and required inside User model. To fix it you can add blank=True arguments to the fields which may be blank, like phone:

class User(AbstractUser):

    username = None    
    email = models.EmailField(unique=True)    
    phone = models.CharField(max_length=15, blank=True) 
    is_pro = models.BooleanField(default=False)    

此运行后, makemigrations migrate 即可在数据库级别应用更改。

After this run makemigrations and migrate to apply changes at DB level.

UPD

在视图中,您需要从 request.data 直接:

In view you need to get data from request.data directly:

def post(self, request):
    serializer = self.serializer_class(data=request.data)
    serializer.is_valid(raise_exception=True)
    serializer.save()

    return Response(serializer.data, status=status.HTTP_201_CREATED)

request.data 不包含 user 键,因此 request.data.get('user',{})返回空字典。

request.data doesn't contain user key, so request.data.get('user', {}) return empty dict.

这篇关于Django Rest Framework注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆