我在视图中使用 $.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,
})