图像未保存在 Django 项目的媒体目录中
images are not saved in media directory in Django project
我正在尝试上传图片(目前使用 Postman)并将其保存在“媒体”目录中,但是尽管服务器 returns 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
我仍然不明白为什么这不起作用,但我尝试了另一种方法并且它起作用了。
现在,我分两步创建新的 UserBill:
1- 我向服务器发送了一个 POST 请求,包括我想为新账单保存的所有数据,除了图片本身。
2- 我发送一个仅包含图片的 PUT 请求并编辑在上一步中创建的账单。
希望对你也有帮助。
我正在尝试上传图片(目前使用 Postman)并将其保存在“媒体”目录中,但是尽管服务器 returns 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
我仍然不明白为什么这不起作用,但我尝试了另一种方法并且它起作用了。
现在,我分两步创建新的 UserBill:
1- 我向服务器发送了一个 POST 请求,包括我想为新账单保存的所有数据,除了图片本身。
2- 我发送一个仅包含图片的 PUT 请求并编辑在上一步中创建的账单。
希望对你也有帮助。