Django and Jquery $.post function



我在视图中使用 $.post() 函数时遇到问题。我没有收到任何错误。我只是从jscript中什么也没得到。它要么没有达到我的观点,要么我的观点没有调用我的模板。

我的 html 代码段是

<textarea rows="4" cols"30" id="id_new_list" placeholder="Enter a gene list"></textarea>
<button type="button" onclick="parseList();">submit list</button>
<table id="id_list_table">
  <tr><td>{{ new_item_text }}</td></tr>
</table>

我的jscript是:

var main = function(){   
    $('button').click(function(){
       var data = document.getElementById("id_new_list").value;
       $.post('lists/new',{item_text:data});   });
};
$(document).ready(main);

我的观点是:

def home_page(request):   
    return render(request,'lists/home.html',{
        'new_item_text':request.POST.get('item_text',''),
    })  
def new_list(request):   
    data = request.POST.get('item_text','')  
    return render(request,'home.html',{
        'new_item_text': data,
    })

我的网址文件:

urlpatterns = patterns('',
    url(r'^$', 'lists.views.home_page', name='home'),
    url(r'^lists/', include('lists.urls')),
)
urlpatterns = patterns('',
    url(r'^new$','lists.views.new_list',name='new_list'),
    )  

什至没有得到帖子来称呼我的观点,我不认为。我的文本区域和按钮带有表单标签,但我删除了它们并假设可能是 csrf 是问题所在。

虽然shellbye发布的答案可能会解决您的问题,但它也会使您容易受到CSRF攻击。仅当您知道自己在做什么时才使用csrf_exempt。请阅读有关CSRF保护的Django文档以了解更多信息。

其他答案的替代

您需要在每个 POST 请求中传递 CSRF 令牌。

.HTML

<form ...>
    <!-- Set the CSRF token in the template -->
    {% csrf_token %}
    <textarea ... ></textarea>
</form>

{% csrf_token %}模板标记将在模板中生成一个具有随机值的隐藏输入字段,如下所示:

<input type="hidden" name="csrfmiddlewaretoken" value="Sdf67Ghbsdf786afdsdf">

因此,现在您需要访问此值并传入$.post参数。

JS/jQuery

var main = function(){   
    $('button').click(function(){
        // get the value of CSRF token
        var CSRFtoken = $('input[name=csrfmiddlewaretoken]').val();
        var data = document.getElementById("id_new_list").value;
       $.post('lists/new', { 
           item_text: data,
           csrfmiddlewaretoken: CSRFtoken
       });
    });
};

就是这样。确保在$.post参数中,除了csrfmiddlewaretoken之外,你没有命名CSRF令牌,因为Django只能通过这个名称访问它。

另一种选择

如果您必须发出许多不同的 AJAX post请求,则需要将 CSRF 令牌传递给每个请求。为了节省您的麻烦,这里有一个一劳永逸的好方法。

你有一个错别字,cols"30"应该cols="30"

你需要像这样在new_list上方@csrf_exempt():

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def new_list(request):   
data = request.POST.get('item_text','')  
    return render(request,'home.html',{
        'new_item_text': data,
    })

最新更新