Как загружать файлы с помощью DRF и React?

Я изучаю Django Rest Framework, все шло хорошо, пока мне не понадобилось создать сервис для загрузки файлов в мое приложение. Сколько бы я не читал документацию, я не могу в ней разобраться. Сначала я хочу уточнить, что я не эксперт в программировании, я новичок, но с каждым днем я узнаю все больше и больше. Из того, что мне удалось понять на данный момент: Документы и фотографии не хранятся в базе данных. Эти файлы хранятся в папке

Это правильно?

У меня есть форма, которая позволяет загружать несколько файлов. пример:

file.txt, document.doc, photo.png и т.д...

Мое представление (Frontend):

import { useState } from "react";
import axios from "axios";

const Form = () => {
  const [state_files, setState_Files] = useState(null);

  const UploadFiles = function (event) {
    setState_Files(event);
  };

  const InsertFiles = async function () {
    const formData = new FormData();
    for (let index = 0; index < state_files.length; index++) {
      formData.append("files", state_files[index]);
    }

    await axios
      .post("http://127.0.0.1:8000/api/v1/upload/", formData)
      .then((response) => {
        console.log(response.data);
      })
      .catch((error) => {
        console.log(error);
      });
  };
  return (
    <>
      <input
        type="file"
        name="files"
        multiple
        onChange={() => InsertFiles(event.target.files)}
      />
      <button>Upload All files</button>
    </>
  );
};

export default Form;

Backend

url.py

path("upload/", Storage_View.as_view(), name="storage-index"),

storage/view.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser


class Storage_View(APIView):
    parser_classes = [MultiPartParser]

    def put(self, request, filename, format=None):
        file_obj = request.data['file']
        # ...
        # What do I have to do here?
        # ...
        return Response({'received data': request.data})

Вопросы:

  1. Why don't I see the button to upload files using the DFR tool? see attached files

enter image description here

  1. The documentation does not explain what I have to do inside the function comment https://www.django-rest-framework.org/api-guide/parsers/ def put(...):

  2. How do I specify the path where you have to store the files you upload?

Пожалуйста, мне нужно руководство.

1: покажите свои модели для более подробного описания. вы должны использовать filefield или imagefield в вашей модели. Вы можете погуглить и прочитать больше об этих полях.

2: put - это для обновления, напишите свой метод post для сохранения данных. Вам не нужно делать там ничего серьезного. просто проверьте, если serializer.is_Valid() для request.data и, если данные верны, сделайте serializer.save(). serializer.save(). файл или изображение будет загружено в папку upload_to папку, которую вы определите в вашей модели, и вы получите ссылку.

3: читайте больше о upload_to в Django. вы можете определить это с помощью поле модели.

Я использовал ModelViewSet и вот как выглядит метод create -

def create(self, request, format=None):
    data = request.data
    if isinstance(data, list):  # <- is the main logic
        serializer = self.get_serializer(data=request.data, many=True)
    else:
        serializer = self.get_serializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Вы передаете список из фронтенда, а по умолчанию Django работает со словарем, поэтому вам придется управлять этим. Считайте это своим кодом и напишите свой метод post.

Не стесняйтесь писать больше, если у вас есть сомнения, надеюсь, это поможет :)

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