当我为我的应用注册新用户时,我正在尝试上传编码的BASE64图像我在userprofile中使用了ImageField 问题是API给了我以下错误。
{
"userprofile": {
"photo": [
"The submitted data was not a file. Check the encoding type on the form."
]
}
}
这是我在请求中的信息我使用带有标题的POST请求Content-Type:application / json请求我使用来自谷歌的POSTMAN
{
"username": "is690002",
"password": "is690002",
"first_name": "andres ",
"last_name": "Barragan",
"email": "zaturoz.marco@gmail.com",
"userprofile": {
"gender": "F",
"phone_number": "3315854644",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYAB......."
}
}
这是我的model.py
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='userprofile')
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default='M')
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',message="Phone must be entered in the format: '+999999999'. Up 15 digits allowed.")
#The Field on DataBase after check if it's a valid Phone Number.
# validators should be a list
phone_number = models.CharField(validators=[phone_regex], max_length=15, blank=True)
photo = models.ImageField(upload_to = 'C:\ProjectsDJ\carpoolapp\photos', null = True)
我的序列化程序
class UserProfileSerializer(serializers.ModelSerializer):
photo = serializers.ImageField(max_length=None, use_url=False)
class Meta:
model = UserProfile
fields = (
'gender',
'phone_number',
'photo'
)
class UserRegistrationSerializer(serializers.HyperlinkedModelSerializer):
userprofile = UserProfileSerializer()
class Meta:
model = User
fields = (
'username',
'first_name',
'last_name',
'email',
'password',
'userprofile'
)
extra_kwargs = {'password': {'write_only': True}}
#@Override create for create a user and profile from HTTP Request
def create(self, validated_data): #
userprofile_data = validated_data.pop('userprofile')
user = User.objects.create(**validated_data) # Create the user object instance before store in the DB
user.set_password(validated_data['password']) #Hash to the Password of the user instance
user.save() #Save the Hashed Password
UserProfile.objects.create(user=user, **userprofile_data)
return user #Return user object
和我的View.py
class UserRegister(APIView):
permission_classes = ()
def post(self, request):
serializer = UserRegistrationSerializer(data = request.data) #, files = request.FILES)
serializer.is_valid(raise_exception=True) # If the JSON Is
serializer.save() #Save user in DB
return Response(status=status.HTTP_201_CREATED)
注意:如果我不使用imageField我可以创建我的用户等一切都很好,我也在StackOverflow中尝试了两个教程
答案 0 :(得分:3)
Django REST框架不支持通过JSON上传文件。 The documentation mentions that。也许是第三方。
请注意,DRF中的文件上载测试确实使用表单内容类型而不是JSON。
答案 1 :(得分:0)
用于注册用户RegisterSerializer
class RegistrationSerializer(RegisterSerializer):
"""
Formulario de registro personalizado
"""
first_name = serializers.CharField(max_length=50)
last_name = serializers.CharField(max_length=50)
phone_number = serializers.CharField(max_length=30)
street_name = serializers.CharField(max_length=50)
int_number = serializers.CharField(max_length=5)
ext_number = serializers.CharField(max_length=5)
suburb = serializers.CharField(max_length=60)
city = serializers.CharField(max_length=60)
cp = serializers.CharField(max_length=50)
state = serializers.CharField(max_length=60)
backup_phone = serializers.CharField(max_length=30, allow_blank=True)
curp = serializers.CharField(max_length=50)
avatar = serializers.ImageField(allow_empty_file=True, required=False)
def get_cleaned_data(self):
pass
def save(self, request):
pass
它对我有用。