Как разместить несколько изображений вместе в 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>