python - example - react django rest framework
Marco de descanso django para carga de imágenes múltiples (1)
Estoy teniendo problemas con Django Rest Framework para cargar imágenes múltiples. Lo que quiero es que haya una mesa de alquiler donde el usuario complete la información de alquiler junto con varias imágenes a la vez (las imágenes pueden ser como cocina, sala de estar, baño, etc.) por ese alquiler que quieren registrar. una renta puede tener múltiples imágenes, así que tengo un campo de imagen con una relación manytomany. No pude enviar varias imágenes al servidor o a la API. Solo se almacena una imagen en el servidor, pero después de cambiar el diseño de mi base de datos y acceder a la opción ManyToManyField, ni siquiera se almacenará una sola imagen.
settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
MEDIA_URL = ''/media/''
MEDIA_ROOT = os.path.join(BASE_DIR,''media'')
Models.py
class Gallery(models.Model):
image = models.FileField(null=True,blank=True,upload_to=''upload/'')
class Meta:
verbose_name = _(''Gallery'')
verbose_name_plural = _(''Galleries'')
class Rental(models.Model):
listingName = models.CharField(_("Lisitng Name"), max_length=255, blank=False, null=True,
help_text=_("Title of the rental space"))
property = models.CharField(_("Property type"),max_length=10,null=True)
room = models.PositiveIntegerField(_("No of Rooms"), blank=False, null=True,
help_text=_("Number of bedrooms available"))
price = models.PositiveIntegerField(blank=False,null=True)
city = models.CharField(_("City"), max_length=255, blank=False, null=True)
image = models.ManyToManyField(Gallery)
Serializers.py
class GallerySerializer(serializers.ModelSerializer):
class Meta:
model = Gallery
fields=(''pk'',''image'')
class RentalSerializer(serializers.ModelSerializer):
image = GallerySerializer(many=True)
class Meta:
model = Rental
fields = (''pk'',''listingName'',''property'',''city'',''room'',''price'',''image'')
def create(self,validated_data):
listingName=validated_data.get(''listingName'',None)
property=validated_data.get(''property'',None)
city=validated_data.get(''city'',None)
room=validated_data.get(''room'',None)
price=validated_data.get(''price'',None)
image=validated_data.pop(''image'')
return Rental.objects.create(listingName=listingName,property=property,city=city,
room=room,price=price,image=image)
Views.py
class FileUploadView(APIView):
parser_classes = (FileUploadParser, )
def post(self, request, format=None):
uploaded_file = request.FILES[''file'']
print(''up_file is'',uploaded_file)
with open(''/media/upload/''+uploaded_file.name, ''wb+'') as destination:
for chunk in uploaded_file.chunks():
print(''chunk'',chunk)
destination.write(chunk)
destination.close()
return Response(uploaded_file.name, status.HTTP_201_CREATED)
class RentalList(generics.ListCreateAPIView):
serializer_class = RentalSerializer
queryset = Rental.objects.all()
def get(self,request,format=None):
rental = self.get_queryset()
serializer_rental = RentalSerializer(rental,many=True)
return Response(serializer_rental.data)
@permission_classes((IsAdminUser, ))
def post(self,request,format=None):
user=request.user
serializer_rental = RentalSerializer(data=request.data,context={''user'':user})
if serializer_rental.is_valid():
serializer_rental.save()
return Response(serializer_rental.data,status=status.HTTP_201_CREATED)
return Response(serializer_rental.errors,status=status.HTTP_400_BAD_REQUEST)
class RentalDetail(generics.RetrieveUpdateDestroyAPIView):
queryset=Rental.objects.all()
serializer_class = RentalSerializer
Parte frontal para enviar imágenes múltiples a la vez
onDrop(files) {
console.log(''Received files: '', files);
this.setState({
files: files
});
var image = new FormData(files);
console.log(''formdata image'',image);
var multiple_image = files;
console.log(''multiple_image'',multiple_image);
$.each(multiple_image,function(i,file){
image.append(''image_''+i,file);
});
console.log(''images are'',image);
$.ajax({
url:''http://localhost:8000/api/upload/'',
data:image,
contentType:false,
processData:false,
type:''POST'',
mimeType: "multipart/form-data",
});
}
La carga de solicitud en la consola muestra todas las imágenes. ¿Cuál podría ser el problema? ¿Qué he hecho mal?
Creo que habría omitido MEDIA_URL
y MEDIA_ROOT
en el archivo settings.py. Si lo perdió o lo configuró incorrectamente, django colocaría el archivo en otra ubicación fuera de su proyecto, según su sistema operativo (para mí, django colocó el archivo en /home/username/
). Verifique si hay alguna carpeta de ese tipo en su computadora.
Si configuró MEDIA_URL
y MEDIA_ROOT
en settings.py, por favor, actualice la pregunta.