Django Rest Framework注册 [英] Django Rest Framework registrations
问题描述
我有一个自定义用户模型
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 $ c获取数据$ c>直接:
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屋!