Ошибка 405 при попытке обновить изображение в Django
Я не могу обновить изображение_профиля пользователя, я могу обновить всю остальную информацию, связанную с пользователем, но не его изображение профиля. Когда я пытаюсь обновить фотографию_профиля, я получаю нулевое значение для фотографии и эту ошибку:
Method Not Allowed: /update_profile/2/
[29/Apr/2022 14:11:16] "GET /update_profile/2/ HTTP/1.1" 405 13924
Это конечная точка моего API:
path('update_profile/<int:pk>/', views.UpdateProfileView.as_view(), name='update_profile'),
Это мой UpdateProfileView:
class UpdateProfileView(generics.UpdateAPIView):
queryset = User.objects.all()
serializer_class = UpdateUserSerializer
def profile(request):
if request.method == 'PUT':
try:
user = User.objects.get(id=request.user.id)
serializer_user = UpdateUserSerializer(user, many=True)
if serializer_user.is_valid():
serializer_user.save()
return Response(serializer_user)
except User.DoesNotExist:
return Response(data='no such user!', status=status.HTTP_400_BAD_REQUEST)
Мой UpdateUserSerializer:
class UpdateUserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=False)
city = serializers.CharField(source='profile.city', allow_blank=True, required=False)
country = serializers.CharField(source='profile.country', allow_blank=True, required=False)
profile_pic = Base64ImageField(max_length=None, use_url=True, required=False)
# serializers.ImageField(source='profile.profile_pic', use_url=True, required=False)
class Meta:
model = User
#, 'city', 'country', 'bio'
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'city', 'country', 'profile_pic']
# fields = UserDetailsSerializer.Meta.fields + ('city', 'country')
extra_kwargs = {'username': {'required': False},
'email': {'required': False},
'password': {'required': False},
'first_name': {'required': False},
'last_name': {'required': False},
'city': {'required': False},
'country': {'required': False},
'profile_pic': {'required': False}
}
def update(self, instance, validated_data):
profile_data = validated_data.pop('profile', {})
city = profile_data.get('city')
country = profile_data.get('country')
profile_pic = profile_data.get('profile_pic')
instance = super(UpdateUserSerializer, self).update(instance, validated_data)
profile = instance.profile
if profile_data:
if city:
profile.city = city
if country:
profile.country = country
if profile_pic:
profile.profile_pic = profile_pic
profile.save()
return instance
и мой класс Base64ImageField:
class Base64ImageField(serializers.ImageField):
def to_internal_value(self, data):
from django.core.files.base import ContentFile
import base64
import six
import uuid
#check if this is base64 string
if isinstance(data, six.string_types):
#check if the base64 is in the data format
if 'data:' in data and ';base64' in data:
header,data = data.split(';base64,')
try:
decoded_file = base64.b64decode(data)
except TypeError:
self.fail('invalid_image')
#Generate file name:
file_name = str(uuid.uuid4())[:12]
#Get the file name extension
file_extension = self.get_file_extension(file_name, decoded_file)
complete_file_name = "%s.%s" % (file_name, file_extension, )
data = ContentFile(decoded_file, name=complete_file_name)
return super(Base64ImageField, self).to_internal_value(data)
def get_file_extension(self, file_name, decoded_file):
import imghdr
extension = imghdr.what(file_name, decoded_file)
extension = "jpg" if extension == "jpeg" else extension
return extension
Есть идеи, где я ошибаюсь?