Как загрузить файл в Django rest framework API с помощью Axios и react hook формы?
Я создал API, используя Django Rest Framework. В нем есть возможность загрузки изображений. Но я не могу загрузить файл. Я использую Axios для вызовов API и react hook form для обработки формы. Я размещаю код ниже для лучшего понимания.
Django: Модель:
class BlogModel(models.Model):
user = models.ForeignKey(user_model.User, on_delete=models.CASCADE, related_name="user_blog")
blogtitle = models.CharField(max_length=250)
blogcontent = models.TextField()
blogimg = models.ImageField(upload_to="blog_image", blank=True)
slug = models.SlugField(max_length=250, unique=True)
tags = models.ManyToManyField(BlogTagsModel, related_name='blog_tags', blank=True, null=True)
published_date = models.DateTimeField(auto_now_add=True)
edit_date = models.DateTimeField(auto_now=True)
Сериализатор
class BlogSerializer(serializers.ModelSerializer):
class Meta:
model = blog_model.BlogModel
fields = '__all__'
extra_kwargs = {
'user': {'read_only': True},
'slug': {'read_only': True},
}
Вид
class BlogPostView(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
serializer_class = blog_ser.BlogSerializer
queryset = blog_model.BlogModel.objects.all()
def perform_create(self, serializer):
rand_num = random.randint(99, 222)
blog_slug_str = f"{serializer.validated_data.get('blogtitle')}{rand_num}"
sample_string_bytes = blog_slug_str.encode("ascii")
base64_bytes = base64.b64encode(sample_string_bytes)
slug = base64_bytes.decode("ascii")
serializer.save(user=self.request.user, slug=slug)
Реакция:
Форма JSX
Axios Call
const onSubmit = data => {
console.log(data.image['0']);
const payload = {
blogtitle: data.title,
blogcontent: data.details,
blogimg: data.image,
}
console.log(payload);
myAxios.post('/api/post/', payload).then(res => {
console.log(res);
}).catch(err => {
console.log(err.response.data);
})
}
Когда я отправляю форму, ошибка говорит, The submitted data was not a file. Check the encoding type on the form..
При утешении полезной нагрузки я получаю:
{
"blogtitle": "nok",
"blogcontent": "asasa",
"blogimg": {
"0": {}
}
}
Пожалуйста, помогите мне...
Я нашел решение.
Оказывается, мне нужно добавить заголовок 'Content-Type': 'multipart/form-data' к запросу Axios.
Ниже я размещаю обновленный код:
Axios Call
const onSubmit = data => {
const payload = {
blogtitle: data.title,
blogcontent: data.details,
blogimg: data.image['0'],
}
console.log(payload);
myAxios.post('/api/post/', payload, {
headers: {
'Content-Type': 'multipart/form-data'
}
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err.response.data);
})
}