2016-01-26 16 views
5

Ho un momento difficile con Django Rest Framework per il caricamento di più immagini. Quello che voglio è, c'è una tabella di noleggio in cui l'utente si occuperà di informazioni di noleggio insieme a più immagini contemporaneamente (le immagini possono essere come la cucina, il soggiorno, il bagno, ecc.) per l'affitto che vogliono registrare. un affitto può avere più immagini, quindi ho campo immagine con molte relazioni. Non potrei inviare più immagini al server o alla api. Una sola immagine utilizzata per essere memorizzata sul server, ma dopo aver modificato la progettazione del mio database e aver scelto l'opzione ManyToManyField, neanche una singola immagine verrà memorizzata.django rest framework per il caricamento di più immagini

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 

Frontend parte per l'invio di immagini multiple in una sola volta

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", 
      }); 
     } 

Richiesta payload sulla console mostra tutta l'images.What potrebbe essere il problema? Cosa ho fatto di sbagliato?

+0

Potresti anche postare il tuo file 'urls.py'? Sarebbe di grande aiuto provare a riprodurre questo problema. Grazie. – AdelaN

risposta

0

Penso che avreste perso MEDIA_URL e MEDIA_ROOT nel file settings.py. Se ti sei perso o configurato in modo errato, django colloca il file in un'altra posizione fuori dal tuo progetto a seconda del tuo sistema operativo (per me django ha inserito il file in /home/username/). Controlla se esiste una cartella del genere nel tuo computer.

Se sono state configurate MEDIA_URL e MEDIA_ROOT in settings.py, si prega di aggiornarle.

+0

Ho aggiornato la mia domanda con media_url e la configurazione di medi_root. – Tushant

Problemi correlati