Django Rest-framework:无法创建带有个人资料图片的用户
Django Rest-framework: Unable to create a user with profile picture
我正在编写一个创建用户 API,方法是将 class users
扩展为 AbstractBaseUser
class。 API 对于常规 model fields
来说工作正常,例如 EmailField
、CharField
、BooleanField
。但后来我决定也存储 profile_picture
用户。因此,我创建了一个新字段 profile_picture
作为 ImageField
以将用户个人资料图片的路径存储在相同的扩展 users
模型中。
models.py
class Users(AbstractBaseUser, PermissionsMixin):
"""
This model is used to store user login credential and profile information.
It's a custome user model but used for Django's default authentication.
"""
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255, blank=False, null=False)
last_name = models.CharField(max_length=255, blank=False, null=False)
profile_picture = models.ImageField(upload_to='Images/', max_length=None, blank=True)
is_active = models.BooleanField(default=True)
# defing a custome user manager class for the custome user model.
objects = managers.UserManager()
# using email a unique identity for the user and it will also allow user to use email while logging in.
USERNAME_FIELD = 'email'
然后我更新了 UserAPIView
class 添加了 parser_classes = (FileUploadParser)
view.py
from django.shortcuts import render
from . import views
from rest_framework.views import APIView
from django.db import IntegrityError
from rest_framework import status
from . import models, serializers
from rest_framework.response import Response
from django.core.mail import send_mail
from rest_framework.parsers import FileUploadParser
class UserAPIViews(APIView):
"""
"""
parser_classes = (FileUploadParser)
def post(self, request, format=None):
"""
"""
print(request.data)
serialized_data = serializers.UserSerializer(data=request.data)
if serialized_data.is_valid():
try:
user_id = serialized_data.save()
except IntegrityError as error:
message = f"Email already exist."
return Response ({
'error_message' : message,
'status' : status.HTTP_226_IM_USED
})
subject = 'Eitan - Case Manager Account Credentials'
body = f"Hi {serialized_data.validated_data.get('first_name')} Your case manager account is ready. Please use following credentials to login. Email - {serialized_data.validated_data.get('email')}, Password - {serialized_data.validated_data.get('password')} Thank You! Team Eitan."
sender = "steinnlabs@gmail.com"
to = serialized_data.validated_data.get('email')
send_mail(subject, body, sender, [to], fail_silently=False)
success_message = f"User has been created."
return Response({
'success_message' : success_message,
'status' : status.HTTP_201_CREATED
})
else:
return Response (serialized_data.error_messages)
已更新 settings.py
以添加 MEDIA_ROOT
和 MEDIA_URL
settings.py
# Image upload configurations
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/
现在,当我将对象传递给端点时 http://127.0.0.1:8000/user/create/
它 returns -
{
"detail": "Missing filename. Request should include a Content-Disposition header with a filename parameter."
}
JSON对象
{
"first_name": "Abhishek",
"last_name": "Muley",
"email": "yogesh@steinnlabs.com",
"password": "1234",
"profile_picture":"Users/jeetpatel/Desktop/sample_image.png"
}
不是发送数据json对象,而是将数据作为表单对象发送,如果您选择将数据作为表单对象发送,那么您需要提及parser_classes = [FileUploadParser, FormParser, MultiPartParser ]
以下是帮助定义表单数据的link。
class UserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
request = self.context.get('request')
user_obj = user.User.objects.create(**validated_data)
class UserViewSet(viewsets.ModelViewSet):
queryset = user.User.objects.all()
serializer_class = user_details_serializer.UserSerializer
# permission_classes = (AdminAccessPermission,)
filter_backends = [filters.OrderingFilter, filters.SearchFilter]
parser_classes = (MultiPartParser, FormParser)
search_fields = ['id', 'username', 'email', 'first_name', 'last_name', 'phone', 'status']
ordering_fields = ['id', 'username', 'email', 'first_name', 'last_name', 'phone', 'status']
我正在编写一个创建用户 API,方法是将 class users
扩展为 AbstractBaseUser
class。 API 对于常规 model fields
来说工作正常,例如 EmailField
、CharField
、BooleanField
。但后来我决定也存储 profile_picture
用户。因此,我创建了一个新字段 profile_picture
作为 ImageField
以将用户个人资料图片的路径存储在相同的扩展 users
模型中。
models.py
class Users(AbstractBaseUser, PermissionsMixin):
"""
This model is used to store user login credential and profile information.
It's a custome user model but used for Django's default authentication.
"""
email = models.EmailField(max_length=255, unique=True)
first_name = models.CharField(max_length=255, blank=False, null=False)
last_name = models.CharField(max_length=255, blank=False, null=False)
profile_picture = models.ImageField(upload_to='Images/', max_length=None, blank=True)
is_active = models.BooleanField(default=True)
# defing a custome user manager class for the custome user model.
objects = managers.UserManager()
# using email a unique identity for the user and it will also allow user to use email while logging in.
USERNAME_FIELD = 'email'
然后我更新了 UserAPIView
class 添加了 parser_classes = (FileUploadParser)
view.py
from django.shortcuts import render
from . import views
from rest_framework.views import APIView
from django.db import IntegrityError
from rest_framework import status
from . import models, serializers
from rest_framework.response import Response
from django.core.mail import send_mail
from rest_framework.parsers import FileUploadParser
class UserAPIViews(APIView):
"""
"""
parser_classes = (FileUploadParser)
def post(self, request, format=None):
"""
"""
print(request.data)
serialized_data = serializers.UserSerializer(data=request.data)
if serialized_data.is_valid():
try:
user_id = serialized_data.save()
except IntegrityError as error:
message = f"Email already exist."
return Response ({
'error_message' : message,
'status' : status.HTTP_226_IM_USED
})
subject = 'Eitan - Case Manager Account Credentials'
body = f"Hi {serialized_data.validated_data.get('first_name')} Your case manager account is ready. Please use following credentials to login. Email - {serialized_data.validated_data.get('email')}, Password - {serialized_data.validated_data.get('password')} Thank You! Team Eitan."
sender = "steinnlabs@gmail.com"
to = serialized_data.validated_data.get('email')
send_mail(subject, body, sender, [to], fail_silently=False)
success_message = f"User has been created."
return Response({
'success_message' : success_message,
'status' : status.HTTP_201_CREATED
})
else:
return Response (serialized_data.error_messages)
已更新 settings.py
以添加 MEDIA_ROOT
和 MEDIA_URL
settings.py
# Image upload configurations
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/
现在,当我将对象传递给端点时 http://127.0.0.1:8000/user/create/
它 returns -
{
"detail": "Missing filename. Request should include a Content-Disposition header with a filename parameter."
}
JSON对象
{
"first_name": "Abhishek",
"last_name": "Muley",
"email": "yogesh@steinnlabs.com",
"password": "1234",
"profile_picture":"Users/jeetpatel/Desktop/sample_image.png"
}
不是发送数据json对象,而是将数据作为表单对象发送,如果您选择将数据作为表单对象发送,那么您需要提及parser_classes = [FileUploadParser, FormParser, MultiPartParser ]
以下是帮助定义表单数据的link。
class UserSerializer(serializers.ModelSerializer):
def create(self, validated_data):
request = self.context.get('request')
user_obj = user.User.objects.create(**validated_data)
class UserViewSet(viewsets.ModelViewSet):
queryset = user.User.objects.all()
serializer_class = user_details_serializer.UserSerializer
# permission_classes = (AdminAccessPermission,)
filter_backends = [filters.OrderingFilter, filters.SearchFilter]
parser_classes = (MultiPartParser, FormParser)
search_fields = ['id', 'username', 'email', 'first_name', 'last_name', 'phone', 'status']
ordering_fields = ['id', 'username', 'email', 'first_name', 'last_name', 'phone', 'status']