2017-03-19 31 views
0

我是新来的ajax和Django,我试图发送一个表单中的文件使用formdata和ajax,但我得到csrf令牌失踪错误,我已经搜查很多但如果是这样,怎么样。我真的需要help.My代码在这里解决不了这个problem.Should我使用cookies:??发布与Ajax的formdata在Django中有csrf错误

urls.py

...

url(r'^administration/library/add_ebook/ajax/$',upload_ebook_ajax, name='upload_ebook_ajax'), 

...

forms.py

class EbookForm(forms.ModelForm): 
    class Meta: 
     model = Ebook 
     fields = ('ebook_title', 'ebook_publisher','ebook_publication_date','ebook_Type','ebook_keywords','ebook_preview','ebook_url','ebook_categories',) 

views.py

@transaction.atomic() 
def upload_ebook_ajax(request): 

if request.method == 'POST': 
    form = EbookForm(request.POST, request.FILES) 
    if form.is_valid(): 

     form.save() 
     data['form_is_valid'] = True 

    else: 
     data['form_is_valid'] = False 
else: 
    form = EbookForm() 

context = {'form': form} 
data['html_form'] = render_to_string('upldebook.html',context,request=request) 
return JsonResponse(data) 

upldebook.html

{% load crispy_forms_tags %} 
{% crispy form %} 

add_ebook.html

<div class="c"> 
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
        <script src="{% static 'js/jquery-file-upload/vendor/jquery.ui.widget.js' %}"></script> 
        <script src="{% static 'js/jquery-file-upload/jquery.iframe-transport.js' %}"></script> 
        <script src="{% static 'js/jquery-file-upload/jquery.fileupload.js' %}"></script> 
       <form method="post" enctype="multipart/form-data" action="{% url 'upload_ebook_ajax' %}" class="js-upload-ebook-form"> 
        {% csrf_token %} 

        <div class="frmclass"></div> 



       <script src="{% static 'uploadebook.js' %}"></script> 


        <button type="submit">Upload</button> 
        </form> 
       </div> 

uploadebook.js

//for showing form 
$.ajax({ 
     url: '/administration/library/add_ebook/ajax', 
     type: 'get', 
     dataType: 'json', 
     success: function (data) { 
     $(".frmclass").html(data.html_form); 
     } 
    }); 
//for form submit 
    $(".js-upload-ebook-form").submit(function (e) { 
    e.preventDefault(); 
    var frmdt = new FormData($('form').get(0)); //I don't know what is 'form' :| 
    frmdt.append('csrfmiddlewaretoken', '{{ csrf_token }}'); 
    $.ajax({ 
    url: $(this).attr('action'), 
    type: $(this).attr('method'), 
    data: frmdt, 
    cache: false, 
    processData: false, 
    contentType: false, 
    dataType: 'json', 
    success: function(data) { 
     alert("SUCCESS1"); 
     window.location = "/" 
    } 

    }); 
    return false; 
    }); 

回答

2

一个解决方法我用的是添加@csrf_exempt到您的AJAX方法(它可能会降低安全性):

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def upload_ebook_ajax(request): 
    # your code 
+0

感谢@igo但是当我用这个,eveything听起来不错,但没有被保存到我的数据库:( 甚至提醒SUCCESS1但没有保存 –

+0

嗯,这是完全不同的问题。 ..也许你提出了一个GET请求或表单是无效的... – igo

+0

不是它的POST和我的表单是有效的,因为我在我的视图验证 –

0

序列化数据领域,令牌将随之发布

data: frmdt.serialize(), 

阅读本SO post页面了解更多,你的回答可能是有

+0

未捕获TypeError:frmdt.serialize不是一个函数 –

2

{% csrf_token %}把你的表单内隐藏的HTML的输入,所以如果你只是原来输入的形式,它应该工作。

data: $(this).serialize(); 
+0

它不适用于我 –