Как разместить несколько изображений вместе в django?

Я хочу создать пост-запрос с несколькими изображениями в django.

Я попробовал создать другую модель для изображений и подключил ее к моей модели 'vehicle' с помощью OnetoOneField, но она позволяет размещать только 1 изображение за раз (этот метод показан ниже)

Я также пытался получить несколько изображений в виде строки, разделенной запятыми, но когда я размещаю свои изображения в виде списка бинарных изображений, он выдает ошибку 'invalid type'.

Мне просто нужно создать API для размещения нескольких изображений за один раз.

Вот мой файл model.py -

class VehicleImage(models.Model):
    image_id = models.AutoField(primary_key=True)
    image = models.ImageField(upload_to="media")
    def __str__(self):
        return self.vehicle.auction_title

class Vehicle(models.Model):
    auction_title = models.TextField()
    vehicle_images = models.ManyToManyField(VehicleImage, blank=True)
    vehicle_images_list = models.TextField()
    def __str__(self):
        return self.auction_title

Файлы Serializer.py -

class VehicleImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = VehicleImage
        fields = "__all__"

class VehicleSerializer(serializers.ModelSerializer):
    vehicle_images = VehicleImageSerializer(many=True, read_only=True)
    
    class Meta:
        model = Vehicle
        fields = "__all__"

    def create(self, validated_data):
        images_data = validated_data['vehicle_images_list']
        vehicle = Vehicle.objects.create(**validated_data)
        if images_data!="":
            for data in images_data.split(','):
                image = VehicleImage.objects.get(image_id=data)
                vehicle.vehicle_images.add(image)
        return vehicle

ФайлViews.py

class add_vehicle(ListCreateAPIView):        
    queryset = Vehicle.objects.all().order_by('-vehicle_id')
    serializer_class = VehicleSerializer
    pagination_class = CustomPagination

    def post(self, request, format=None):
        # creating the Vehicle
        vehicle_serializer = VehicleSerializer(data=request.data)
        if vehicle_serializer.is_valid():
            vehicle_serializer.save()
            return Response({
                "response":{"vehicle_id":vehicle_serializer.data['vehicle_id']},
                "status_code":200}, status = status.HTTP_200_OK)
        return Response({
                "response":vehicle_serializer.errors,
                "status_code":400}, status = status.HTTP_400_BAD_REQUEST)

class add_images(ListCreateAPIView):
    queryset = VehicleImage.objects.all()
    serializer_class = VehicleImageSerializer
    pagination_class = CustomPagination

    def post(self, request, format=None):
        image_serializer = VehicleImageSerializer(data=request.data)
        if image_serializer.is_valid():
            image_serializer.save()
            return Response({
                "response":image_serializer.data,
                "status_code":200}, status = status.HTTP_200_OK)
        return Response({
                "response":image_serializer.errors,
                "status_code":400}, status = status.HTTP_400_BAD_REQUEST)

Используя этот метод, я сначала добавляю изображения по одному с помощью класса 'add_images', а затем задаю список идентификаторов изображений при создании автомобиля. Есть ли способ добавить все изображения за один раз?

Чтобы сделать пост из нескольких изображений в базе данных, сначала нужно создать отдельные модели изображений для ваших транспортных средств, как показано ниже: Model.py

class Vehicle(models.Model):
    auction_title = models.TextField()
    description = models.CharField(max_length=200)
    date_created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.auction_title

class VehicleImage(models.Model):
    vechicle  = models.ForeignKey(Vehicle,on_delete=models.CASCADE)
    image = models.ImageField(upload_to="media")
    def __str__(self):
        return self.vehicle.auction_title

Затем вы связываете две модели вместе в вашем admin.py с помощью stackedInline, например так:

class VehicleImagesAdmin(admin.StackedInline):
       model = VehicleImage

class VehicleAdmin(admin.ModelAdmin):
      # The field your want to display 
      list_display  = ['auction_title','date_created']
      # Here you link the models together 
      inlines = [VehicleImagesAdmin]

Теперь вам нужно создать форму для обработки нескольких загрузок

class VehicleImagesForm(forms.ModelForm):
    class Meta:
        model = VehicleImage
        fields = ['image']
        widget = forms.ClearableFileInput(attrs={'multiple':True})

Затем мы сосредоточимся на создании представления для обработки процесса пост-запроса для нескольких изображений, имейте в виду, что я собираюсь написать представление на основе функций, чтобы сохранить его простым, это во многом то же самое соглашение или мудрость с представлением на базе классов, так что вы можете обойти его, используя свою собственную мудрость. но это работает идеально.

def upload_vehicle_images(request):
    form = VehicleImagesForm(request.POST, request.FILES)
    files = requests.FILES.getlist['image']
    auction_title = request.POST['auction_title']
    description = request.POST['descritpion']
    vehicle = Vehicle(auction_title=auction_title,description=description)
    vehicle.save()
    # You would have to make some iterations through the list images inorder to post 
    # them to your database
    if form.is_valid:
       for file in files:
           vehicle_image_data = VehicleImage(vehicle=vehicle, image=file)
           vehicle_image_data.save() 
    return redirect(# redirect to anywhere you)

HTML шаблон для размещения нескольких изображений

 <form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
<textarea class=""name="auction_title" id="id_auction_title"></textarea>
  <textarea class="" name="description" id="id_description"></textarea>
   <input  type="file" name="image"  id="id_image" multiple accept="image/*" >
 <button  type="submit">Post</button> 
</form>

Или вы можете просто использовать форму, когда добавляете ее в контекст

<form method="POST" action="" enctype="multipart/form-data">
 {% csrf_token %}
 {% form %}
 <button  type="submit">Post</button> 
</form>

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