Django:使用 AJAX 上传文件:表单表示文件输入字段为空(或 CSRF 令牌丢失或不正确)

巴兰卡

我正在尝试在我的 Django 应用程序中添加一个非常简单的文件上传模式表单。

但是,当我单击提交按钮时,表单会向我显示一条错误消息:“此字段是必需的”。

一切都正确呈现:

  • 我的主页正确加载
  • 当我单击“Agregar archivo adjunto”按钮(“添加附件”)时,模态表单会正确显示,并且所有字段都按照我想要的方式呈现。
  • 当我单击模式字段中的“Adjuntar archivo”(“附加文件”)按钮时,问题就出现了:表单引发错误,就好像我试图上传“空”文件一样!

现在......我忘记添加cache: false, contentType: false, processData: false$.ajax()呼叫中,但是,当我添加它们时,我收到以下错误:Forbidden (CSRF token missing or incorrect.)所以......我不知道如何进行!

我已经(成功地)编写了一个模态表单,它可以帮助我向我的lead对象添加注释(相关)(使用参考),并且我正在尝试为文件上传模态对话框重现完全相同的过程......但它不起作用:(

任何帮助将不胜感激。

顺便说一句:我正在使用 Chrome 对此进行测试(不会使用 IE!)



这是我的代码:

模型.py

def lead_dir_path(instance, filename):
    """
    Files will be saved to: MEDIA_ROOT/leads/<int:pk>/<filename>
    where <int:pk> is lead's primary key, and <filename> is just that.

    Filename will be set to an UUID value.
    """
    ext = filename.split('.')[-1]
    filename = '%s.%s' % (uuid.uuid4(), ext)
    return 'leads/%s/%s' % (instance.lead.pk, filename)


class ArchivosAdjuntosLead(models.Model):
    lead = models.ForeignKey(Lead, on_delete=models.CASCADE)
    descripcion = models.CharField(max_length=100)
    archivo = models.FileField(upload_to=lead_dir_path)

视图.py

def agregar_adjunto_json(request, pk):
    """
    Adds a file to lead with id=pk
    """
    context = {}
    data = {}

    lead = get_object_or_404(Lead, pk=pk)
    context['lead'] = lead

    if request.method == 'POST':
        form = AdjuntarArchivoLeadForm_v2(request.POST, request.FILES)
        if form.is_valid():
            form.save();
            data['form_is_valid'] = True
        else:
            data['form_is_valid'] = False
    else:
        form = AdjuntarArchivoLeadForm_v2()
        form.initial = {'lead': lead}
    context['form'] = form

    data['html_form'] = render_to_string(
        template_folder + 'partial_templates/partial_adjuntar_archivo.html',
        context,
        request = request,
    )
    return JsonResponse(data)

表格.py

class AdjuntarArchivoLeadForm_v2(forms.ModelForm):
    class Meta():
        model = ArchivosAdjuntosLead
        fields = ['lead', 'descripcion', 'archivo']

        widgets = {
          'lead': forms.TextInput(attrs={'class':'form-control', 'style':'display:none;'}),
          'descripcion': forms.TextInput(attrs={'class':'form-control'}),
          'archivo': forms.FileInput(attrs={'class':'form-control'}),
        }

partial_attach_file.html

我使用这个部分模板来创建一个模态表单:

<form method="POST" enctype="multipart/form-data"
      action="{% url 'leads:agregar_adjunto_v2' pk=lead.pk %}"
      id="js_adjuntar_archivo_form">
  {% csrf_token %}

  <div class="modal-header">
    <h4 class="modal-title">Adjuntar archivo</h4>
  </div>

  <div class="modal-body">

    {{ form.as_p }}

    <div class="modal-footer">
      <button type="submit" class="btn btn-primary col-4">Adjuntar archivo</button>
      <button type="button" class="btn btn-secondary col-4" data-dismiss="modal">Cancelar</button>
    </div>
  </div>
</form>

my_lead_page.html

这是我创建模态表单的页面:

{% extends "leads/base.html" %}

{% load static %}

{% block contenido %}

<!-- Lots and lots of info -->
<button type="button" class="btn btn-sm btn-primary col-2" id="btn_agregar_adjunto">
  Agregar archivo adjunto
</button>
{% endblock %}

{% block other_scripts %}
<script type="text/javascript" src="{% static 'js/leads/archivos_adjuntos.js'%}"></script>

{% endblock %}

files_attachments.js

$(function() {
  $("#btn_agregar_adjunto").click(function() {
    $.ajax({
      url: 'adjuntar_archivo/',
      type: 'get',
      dataType: 'json',
      beforeSend: function() {
        $("#modal-form").modal("show");
      },
      success: function(data) {
        $("#modal-form .modal-content").html(data.html_form);
      }
    });
  });

  $("#modal-form").on("submit", "#js_adjuntar_archivo_form", function() {
    var form = $(this);
    $.ajax({
      url: form.attr("action"),
      data: form.serialize(),
      type: form.attr("method"),
      dataType: 'json',
      cache: false,
      contentType: false,
      processData: false, 
      success: function(data) {
        if(data.form_is_valid) {
          alert("Archivo adjuntado");
        } else {
          $("#modal-form .modal-content").html(data.html_form);
        }
      }
    });
    return false;
  });
  
});
勒迈泽尔

它应该可以工作,而不是form.serialize()尝试用 js 发送它formData()

下面是一个例子:

$("#modal-form").on("submit", "#js_adjuntar_archivo_form", function() {
    $that = this;
    var form = new FormData($(this)[0]);

    $.ajax({
        url:$that.attr("action"),
        type:$that.attr("method"),
        data:form,
        processData: false,
        contentType: false,

        // rest of the code'''

    });
    return false;
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django 1.9:使用Stripe的CSRF令牌丢失或不正确

来自分类Dev

禁止(CSRF令牌丢失或不正确)Django错误

来自分类Dev

CSRF令牌丢失或在Django中不正确

来自分类Dev

将django与邮递员{“ detail”:“ CSRF失败:CSRF令牌丢失或不正确。”}

来自分类Dev

“ CSRF失败:CSRF令牌丢失或不正确。” 在Django Rest中:UpdateModelMixin

来自分类Dev

使用Django和JS的“禁止(CSRF令牌丢失或不正确。):”

来自分类Dev

没有jQuery的Django CSRF丢失或不正确的Ajax POST(Vanilla JavaScript)

来自分类Dev

Django 1.9.2 + jQuery + POST-错误403-CSRF令牌丢失或不正确

来自分类Dev

Django + VueJS:POST 403禁止-CSRF令牌丢失或不正确

来自分类Dev

Django 服务器 403(CSRF 令牌丢失或不正确)

来自分类Dev

禁止(CSRF令牌丢失或不正确。)

来自分类Dev

CSRF失败:CSRF令牌丢失或不正确

来自分类Dev

CSRF令牌在一页上丢失或不正确

来自分类Dev

Python 请求:CSRF 令牌丢失或不正确

来自分类Dev

Django CSRF cookie设置不正确

来自分类Dev

Django 1.9 AJAX表单CSRF令牌403错误-“未设置CSRF Cookie”

来自分类Dev

详细信息:“ CSRF失败:CSRF令牌丢失或不正确。”

来自分类Dev

如何正确使用csrf令牌扩展表单?

来自分类Dev

如何正确使用csrf令牌扩展表单?

来自分类Dev

CSRF令牌丢失或无效的Django

来自分类Dev

Flask AJAX:错误的请求。CSRF令牌丢失

来自分类Dev

带有csrf令牌的ajax视图上的django 403错误

来自分类Dev

Django-Ajax登录后CSRF令牌似乎无效

来自分类Dev

Ajax表单提交不正确

来自分类Dev

使用 ajax post 传递事件以使用 csrf 令牌查看

来自分类Dev

使用GPXPY解析gpx文件会导致格式不正确的无效令牌错误

来自分类Dev

在基于AJAX的应用程序中使用令牌防止CSRF

来自分类Dev

使用AJAX GET方法进行CSRF令牌保护

来自分类Dev

Django CSRF令牌丢失或错误错误

Related 相关文章

  1. 1

    Django 1.9:使用Stripe的CSRF令牌丢失或不正确

  2. 2

    禁止(CSRF令牌丢失或不正确)Django错误

  3. 3

    CSRF令牌丢失或在Django中不正确

  4. 4

    将django与邮递员{“ detail”:“ CSRF失败:CSRF令牌丢失或不正确。”}

  5. 5

    “ CSRF失败:CSRF令牌丢失或不正确。” 在Django Rest中:UpdateModelMixin

  6. 6

    使用Django和JS的“禁止(CSRF令牌丢失或不正确。):”

  7. 7

    没有jQuery的Django CSRF丢失或不正确的Ajax POST(Vanilla JavaScript)

  8. 8

    Django 1.9.2 + jQuery + POST-错误403-CSRF令牌丢失或不正确

  9. 9

    Django + VueJS:POST 403禁止-CSRF令牌丢失或不正确

  10. 10

    Django 服务器 403(CSRF 令牌丢失或不正确)

  11. 11

    禁止(CSRF令牌丢失或不正确。)

  12. 12

    CSRF失败:CSRF令牌丢失或不正确

  13. 13

    CSRF令牌在一页上丢失或不正确

  14. 14

    Python 请求:CSRF 令牌丢失或不正确

  15. 15

    Django CSRF cookie设置不正确

  16. 16

    Django 1.9 AJAX表单CSRF令牌403错误-“未设置CSRF Cookie”

  17. 17

    详细信息:“ CSRF失败:CSRF令牌丢失或不正确。”

  18. 18

    如何正确使用csrf令牌扩展表单?

  19. 19

    如何正确使用csrf令牌扩展表单?

  20. 20

    CSRF令牌丢失或无效的Django

  21. 21

    Flask AJAX:错误的请求。CSRF令牌丢失

  22. 22

    带有csrf令牌的ajax视图上的django 403错误

  23. 23

    Django-Ajax登录后CSRF令牌似乎无效

  24. 24

    Ajax表单提交不正确

  25. 25

    使用 ajax post 传递事件以使用 csrf 令牌查看

  26. 26

    使用GPXPY解析gpx文件会导致格式不正确的无效令牌错误

  27. 27

    在基于AJAX的应用程序中使用令牌防止CSRF

  28. 28

    使用AJAX GET方法进行CSRF令牌保护

  29. 29

    Django CSRF令牌丢失或错误错误

热门标签

归档