Как загружать файлы с помощью 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})
Вопросы:
- Why don't I see the button to upload files using the DFR tool? see attached files
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(...):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.
Не стесняйтесь писать больше, если у вас есть сомнения, надеюсь, это поможет :)
