Почему после загрузки поле изображения отображается как null, а также возникает ошибка многочастичной формы? Есть ли способ обернуть FormData в post_create в auth.js?
При нажатии на кнопку submit я получаю ошибку MultiPartParser : { "detail": "Ошибка разбора многочастной формы - Неверная граница в многочастной форме: None" }. Поле изображения также равно null. Невозможно изменить состояние FormData. Ниже приведен мой код от бэкенда views до PostData во фронтенде. Я использую react и django.
Вот мой код views.py.
class ManagePostingView(APIView):
parser_classes = [MultiPartParser, FormParser]
def post(self, request, format=None):
request.data['user'] = request.user.id
serializer = PostListSerializer(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)
Вот мой код auth.js для пост запроса.`
export const post_create = (title, content, image) => async (dispatch) => {
if (localStorage.getItem("access")) {
const config = {
headers: {
"Content-Type": "multipart/form-data",
Authorization: `JWT ${localStorage.getItem("access")}`,
},
};
const body = {
title,
content,
image,
};
try {
const res = await axios.post(
`${process.env.REACT_APP_API_URL}/api/list/PostView/`,
body,
config
);
dispatch(load_user());
if (res.data != null) {
dispatch({
type: POST_DATA_SUCCESS,
payload: res.data,
});
} else {
dispatch({
type: POST_DATA_FAIL,
});
}
} catch (err) {
dispatch({
type: POST_DATA_FAIL,
});
}
}
};
Ниже представлен PotData.js Здесь он передает данные от пользователя в post_create, чтобы они могли быть отправлены в бэкенд.
import React, { useState } from "react";
import { Redirect } from "react-router-dom";
import { connect } from "react-redux";
import { post_create } from "../actions/auth";
const PostData = ({ post_create, isAuthenticated }) => {
const [accountCreated, setAccountCreated] = useState(false);
const [postimage, setPostImage] = useState(null);
const [formData, setFormData] = useState({
title: "",
content: "",
image: "",
});
const { title, content, image } = formData;
const onChange = (e) => {4p
if ([e.target.name] == "image") {
setPostImage({ postimage: e.target.files });
}
if ([e.target.name] == "content") {
setFormData({ ...formData, [e.target.name]: e.target.value });
}
if ([e.target.name] == "title") {
setFormData({ ...formData, [e.target.name]: e.target.value });
}
};
const onSubmit = (e) => {
e.preventDefault();
post_create(title, content, image);
setAccountCreated(true);
};
if (accountCreated) {
return <Redirect to="/login" />;
}
return (
<div className="container mt-5">
<h1>Admin page </h1>
<p>Make a New post</p>
<form onSubmit={(e) => onSubmit(e)}>
<div className="form-group">
<input
className="form-control"
type="text"
placeholder="Title*"
name="title"
value={title}
onChange={(e) => onChange(e)}
required
/>
</div>
<div className="form-group">
<input
className="form-control"
type="text"
placeholder="Content*"
name="content"
value={content}
onChange={(e) => onChange(e)}
required
/>
</div>
<div className="form-group">
<input
className="form-control"
type="file"
placeholder="Image*"
name="image"
value={image}
onChange={(e) => onChange(e)}
/>
</div>
<button className="btn btn-primary" type="submit">
Submit Details
</button>
</form>
</div>
);
};
const mapStateToProps = (state) => ({
isAuthenticated: state.auth.isAuthenticated,
});
export default connect(mapStateToProps, { post_create })(PostData);
Я пытался решить эту проблему с помощью этого кода. Я застрял, когда пытался обернуть FormData функцией post_create в auth.js . Какое лучшее решение для этого?
const handleSubmit = (e) => {
e.preventDefault();
let formData = new FormData();
formData.append('title', postData.title);
formData.append('content', postData.content);
formData.append('image', postimage.image[0]);
post_create(formData)