Изображения не сохраняются в каталоге media в проекте Django

Я пытаюсь загрузить картинку (в данный момент с помощью Postman) и сохранить ее в директории "media", но хотя сервер возвращает код состояния 200, в проекте ничего не сохраняется.

urls.py:

urlpatterns = [
    path('users/sign-up', views.RegisterAPI.as_view()),
    path('users/login', views.LoginAPI.as_view()),
    path('users/<int:id>', views.UserProfile.as_view()),
    path('users/<int:id>/bill', views.UploadPicture.as_view()),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

models.py:

class UserBill(models.Model):
    bill_picture = models.ImageField(default='bill_pic', null=True, blank=True)
    sender = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='user')
    created_at = models.DateTimeField(auto_now=True, auto_now_add=False)
    status = models.IntegerField(null=True)

views.py:

class UploadPicture(generics.GenericAPIView):
    permission_classes = [IsAuthenticated, IsAccountOwner]

    def post(self, request, *args, **kwargs):
        new_data = request.data
        new_data['user'] = request.user.id
        new_data['status'] = PaymentStat.PENDING.value

        serializer = UserBillSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        bill = serializer.save()
        return Response({
            "bill": UserBillSerializer(bill, context=self.get_serializer_context()).data,
        }, status=status.HTTP_200_OK)

serializers.py

class UserBillSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserBill
        fields = '__all__'

    def create(self, validated_data):
        user = User.objects.all().get(id=self.initial_data.get('user'))
        bill = UserBill.objects.create(**validated_data, sender=user)
        return bill

    def update(self, instance, validated_data):
        obj = super().update(instance, validated_data)
        obj.is_regular = True
        obj.save()
        return obj

Ваш urls.py должен быть примерно таким.

from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
    path('users/sign-up', views.RegisterAPI.as_view()),
    path('users/login', views.LoginAPI.as_view()),
    path('users/<int:id>', views.UserProfile.as_view()),
    path('users/<int:id>/bill', views.UploadPicture.as_view()),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я все еще не понимаю, почему это не работает, но я попробовал альтернативный подход, и он сработал.

Теперь я создаю новый UserBill в 2 шага:

1- Я отправляю POST-запрос на сервер, включая все данные, которые я хочу сохранить для нового счета, кроме самой фотографии.

2- Я отправляю PUT-запрос, включающий только картинку, и редактирую счет, созданный на предыдущем шаге.

Надеюсь, это поможет и вам.

Вернуться на верх