У меня есть forms.ImageField в моей модели под названием Post. Когда я создаю его экземпляр, я делаю это через Ajax, одновременно отправляя сериализованные данные с помощью data=$(this).serialize() на свой PostCreateAPIView, который является универсальным API CreateView для Django REST Framework, но этот метод сериализует только данные и игнорирует мое изображение.
Вот мой код:
Мой CreateAPIView:
class PostCreateAPIView(generics.CreateAPIView):
serializer_class = PostModelCreateSerializer
permission_classes = [permissions.IsAuthenticated]
def perform_create(self, serializer):
print(self)
serializer.save(user = self.request.user)
Моя форма:
class PostModelCreateForm(forms.ModelForm):
content = forms.CharField(
label = "",
help_text = "",#text to help
widget=forms.Textarea( attrs = {
'cols' : "50", #size
'rows' : "6", #size
'placeholder' : 'Votre publication',
'style' : 'resize : none'
}))
group = forms.ChoiceField(choices=USER_GROUPS, label='')
class Meta:
model = Post #we define the model
fields = [
"content",
"group",
"photo"
]
$(document.body).on("submit", ".post_form_class",function(event){
event.preventDefault();
this_ = $(this);
var formData = this_.serialize();
$.ajax({
method : "POST",
url : createPostUrl,
data : formData,
success : function(data){
},
error : function(data){
}
});
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id = 'post-form' class = "post_form_class" method = "POST" action = "" enctype = "multipart/form-data">
<input type='hidden' name='csrfmiddlewaretoken' value='6bgEU7jPVxXskBGJzP7KzSj9mz75k2dpSqG9Fn1kfghUeWQPTKCbm8JJc5za0ecl' />
<p></p>
<div id = "div_id_content" class = "form-group"> <div class = "controls "> <textarea name = "content" cols = "50" rows = "6" placeholder = "Votre publication" style = "resize : none" class = "textarea form-control" required id = "id_content">
</textarea> </div> </div> <div id = "div_id_group" class = "form-group"> <label for = "id_group" class = "control-label requiredField">
Group<span class = "asteriskField">*</span> </label> <div class = "controls "> <select name = "group" class = "select form-control" id = "id_group"> <option value = "1" selected>Département juridique</option> <option value = "2">Département ingénieurs</option> <option value = "3">Département Commerce</option> <option value = "4">Nouveau</option>
</select> </div> </div> <div id = "div_id_photo" class = "form-group"> <label for = "id_photo" class = "control-label ">
Photo
</label> <div class = "controls "> <input type = "file" name = "photo" class = "clearablefileinput" id = "id_photo" /> </div> </div>
<div class = "row">
<div class='col-sm-2 '>
<input class = "btn btn-primary submit_form" id = "submit_form" type = "submit" value = "Publier"/>
</div>
<div class='col-sm-1 col-sm-offset-8 '>
<span class='post-chars-left' > </span>
</div>
</div>
</form>Примечание: Я пробовал formData = new FormData(this_);, но получаю такую ошибку:
TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement
Сэр, если this_ не является HTMLElement, что это такое? когда я console.info(this_), я получаю элемент HTML
Нет вы не будете. this_.get(0) - это HTMLElement, this_ - это, как я уже писал, элемент jQuery.
Попробуйте FormData (это). Тем не менее ... если вы не отправляете файлы, serialize() будет создавать данные в той же форме.
ваши решения дали эту ошибку> TypeError: 'append' вызывается для объекта, который не реализует интерфейс FormData



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Спасибо Луке, вот и ответ:
$(document.body).on("submit", ".post_form_class",function(event){
event.preventDefault();
var formData = new FormData(this);
$.ajax({
method : "POST",
url : createPostUrl,
data : formData,
processData:false,
contentType:false,
success : function(data){
location.reload(true);
},
error : function(data){
console.info("ERROR:CH0x2 while fetching after creation form submit");
console.info("data :",data.status, data.statusText);
}
});
});
Если вы хотите использовать FormData API, используйте его с HTMLElements, а не с элементами jQuery.