Как добавить изображение в form.serialize ()? - PullRequest
2 голосов

Есть форма.Я пытаюсь добавить image в form.serialize, но это не работает.Вот сама форма.

var frm = $('#id_article_form');
var formData = $('#id_article_form').serializeArray();
formData.push({ name: "image", value: $('input[type=file]')[0].files[0] });

$.ajax({
  type: frm.attr('method'),
  url: "{% url 'draft_create' %}",
  data: formData
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form action="/knowledge_base/add/" class="edit_form new_event" id="id_article_form" enctype="multipart/form-data" onsubmit="submitArticleForm(event, this)" method="POST">
      <input type="hidden" name="csrfmiddlewaretoken" value="QR8lN1G9v6qzlJFuYTnwDBO3FYMb1OWsDwMxS0vpwETdv4JKNbG0auYdCGVG9Ain">
      <div class="content_create">
        <div class="field inline textarea">
          <input type="text" name="title" id="id_title" style="width: 400px;" required="" class="wide" maxlength="254">
        </div>
</div>

        </div>
      </div>
      <div class="footer_content">
        <div class="footer_select">
            <div class="field inline footer_inline select">
                <div class="subhead">Category:</div>
                <select name="category" id="id_category" class="select2" required="">
  <option value="" selected="">---------</option>

  <option value="2">Food</option>

  <option value="1">Sport</option>

</select>
            </div>
            <div class="field inline select" id="id_subcategory_div">
<div class="subhead">Subcategory:</div>
<select name="subcategory" class="select2" id="id_subcategory">
  <option value="2">123</option>

  <option value="1">321</option>
</select>
            </div>
          <div class="field inline footer_inline select">
                <div class="subhead">Status</div>
                <select name="status" class="select2" id="id_status">
  <option value="published">Published</option>

  <option value="not published" selected="">Not published</option>

</select>
            </div>
          </div>

        <div class="event_photo">
          <img id="id_image_show" src="blob:http://127.0.0.1:8000/316edc4e-21b6-4fac-981f-8342619b11a3" data-rjs="2" style="display: inline;">
          <div class="backgroundImage">
            <span class="flaticon-image"></span>
          </div>
          <div class="blind_links">
            <div class="wrapp">
              <a href="javascript:void(0)" onclick="$('#id_image').click()">
                <span class="flaticon-up-arrow-hand-drawn-outline image_upload" style="display: none;"></span>
                <span class="image_upload" style="display: none;">Upload</span>
                <span class="flaticon-two-circling-arrows image_edit" style="display: inline;"></span>
                <span class="image_edit" style="display: inline;">Edit</span>
              </a>
            </div>
          </div>
          <input type="file" name="image" style="display: none;" onchange="addArticleImage(event, this);" id="id_image">
        </div>
        <div class="center">
          <button type="submit" class="submit" id="id_submit">Submit</button>
        </div>
      </div>
      </form>

Изображение src записано в <img id="id_image_show" src="" data-rjs="2">.

object File входит в request.POST, ноизображение не может быть открыто.

1 Ответ

1 голос
/ 07 мая 2019

Я считаю, что вам нужно использовать объект FormData , а не сериализовать форму.

var frm = $('#id_article_form');
var formData = new FormData(frm[0]);
formData.append('file', $('input[type=file]')[0].files[0]);

$.ajax({
    type: frm.attr('method'),
    url: "{% url 'draft_create' %}",
    data: formData,
    processData: false,
    contentType: false
});

Установка значения processData в false позволяет предотвратить автоматическое преобразование данных в jQuery вСтрока запроса.См. документы для получения дополнительной информации.

Установка contentType в значение false является обязательной, поскольку в противном случае jQuery установит его неправильно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...