В BrowsableAPIRenderer нет поля для загрузки файла
Я пытаюсь создать поле для загрузки изображений, чтобы я мог загружать несколько изображений за публикацию. Но, похоже, в нем нет поля для загрузки файлов, не говоря уже о том, что это позволило бы сохранять несколько файлов.
views.py
class PostsViewSet(ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = [IsAuthenticated, IsOwnerOrReadOnly|IsAdminUser]
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = PostFilter
parser_classes = [JSONParser, MultiPartParser, FileUploadParser]
renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
serializers.py
class PostImageSerializer(serializers.ModelSerializer):
class Meta:
model = PostImage
fields = ('image',)
class PostSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
comments = CommentSerializer(many=True, read_only=True, source='comment_set')
likes_count = serializers.SerializerMethodField()
images = PostImageSerializer(source='postimage_set', many=True, read_only=True)
class Meta:
model = Post
fields = "__all__"
def create(self, validated_data):
validated_data["author"] = self.context["request"].user
images_data = self.context.get('view').request.FILES
print(validated_data)
post = Post.objects.create(text=validated_data.get('text'), author=validated_data.get('author'))
for image_data in images_data.values():
PostImage.objects.create(post=post, image=image_data)
return post
models.py
class Post(models.Model):
id = models.AutoField(primary_key=True)
text = models.TextField(max_length=165)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.author} posts "{self.text}"'
class PostImage(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
image = models.ImageField(upload_to='images/', blank=True)
и выглядит это примерно так
Где ошибка?
Поскольку вы собираетесь создавать, удаление read_only=True
из images
поля в PostSerializer и изменение его на что-то вроде этого должно сработать:
class PostSerializer(serializers.ModelSerializer):
images = serializers.ImageField(many=True, write_only=True)
class Meta:
model = Post
fields = "__all__"
def create(self, validated_data):
post = super().create(validated_data)
for image_data in validated_data["images"]:
Post.objects.create(post=post, image=image_data)
return post