How to upload multiple files in django rest framework

后端 未结 3 1878
小蘑菇
小蘑菇 2020-12-05 02:50

In django rest framework, I am able to upload single file using danialfarid/ng-file-upload

views.py:

class PhotoViewSet(viewsets.ModelViewSet):
             


        
3条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-05 03:32

    It took me a while to find out an effective solution to this, I would like to share with you what finally worked for me. I am using reactjs and DRF.

    Here is my model :

    class MediaFile(models.Model):
        article = models.ForeignKey(Articles, on_delete=models.CASCADE, null=True)
        caption = models.CharField(max_length=500, null=True, blank=True)
        file = models.FileField('photo of article', upload_to=set_filename,
                                blank=True, null=True, default='')
        added = models.DateTimeField(auto_now_add=True)
    

    The views are standard viewsets.ModelViewSet

    class MediaFilesViewSet(viewsets.ModelViewSet):
        serializer_class = FileListSerializer
        parser_classes = (parsers.MultiPartParser, parsers.FormParser,)
        queryset=MediaFile.objects.all()
    

    In ArticleSerializer I added:

    def create(self, validated_data):
        request = self.context.get('request')
        user = request.user
        instance = Articles.objects.create(**validated_data)
        instance.publisher = user
        instance.save()
        images = request.FILES
        if images:
            try:
                for f in images.getlist('mediafiles'):
                    instance.mediafile_set.get_or_create(file=f, caption=f.name)
                    instance.save()
            except Exception as e:
                print(e)
        return instance
    

    The FRONTEND structure:

    postChangeImage = (event) =>{
        this.setState({
            is_images: true
        });
        let files = event.target.files;
        const files_array = Object.values(files);
    
        this.setState(
            {imagefile: files}
        );
    
        console.log('IMAGES ARRAY', files_array);
        files_array.map(value => {
            const urls = URL.createObjectURL(value);
            this.setState((prevState)=>(
                {postfolio:[urls, ...prevState.postfolio]}
                ));
        });
    
    };
    

    and POSTING:

    for (let i=0; i< this.state.imagefile.length; i++) {
                        form_data.append(`mediafiles`, this.state.imagefile[i]);
                    }
    

提交回复
热议问题