这是一个Django项目,我必须编制一个在线商店。 在我的html中,我有一个id为“search”的表单,我在我的ajax代码中使用这个'id'来搜索和比较我创建的日期库。最后它必须在屏幕上显示我的可能数据日期基础像谷歌查找器。我的主要问题是CSRF,在控制台我有: “POST / search / HTTP / 1.1”403 2295 我在这个页面上读过有同样问题的人,但我不知道失败的地方。
这是我的ajax代码:
$("#search").keyup(function(){
var cadena = $("#search").val();
var csrf = $("input[name=csrfmiddlewaretoken]").val();
var token = $('input[name=""__RequestVerificationToken""]').val();
if ( cadena.length > 2){
alert(cadena);
$.ajax({
type:"POST",
url: "http://127.0.0.1:8000/search/",
data:{'search_text':cadena,
''csrfmiddlewaretoken' : csrf},
success:function(respuesta){
$('#search-results').html(respuesta);
}
});
}
});
});
我的模板(html):
<td>
{% csrf_token %}
<input type="text" id="search" placeholder="Search"/>
<ul id ="search-results"></ul>
</td>
我的views.py:
def search_title(request):
if request.method == "POST":
search_text = request.POST['search_text']
libros1 = Libros.objects.filter(nombre__contains=search_text)
print("asda");
else:
search_text =''
libros1 = Libros.objects.filter(nombre__contains=search_text)
return render('ajax_search.html',{'libros':libros1})
我的网址:
url(r'^admin/',include(admin.site.urls)),
url(r'^$', 'views.home'),
url(r'^(search)/', 'views.search_title'),
url(r'^(libros)/', 'views.libros'),
url(r'^(carrito)/', 'views.carrito')
在控制台中我得到了:
warnings.warn(模板中使用了“A {%csrf_token%}”,但上下文没有提供值。这通常是由于不使用RequestContext引起的。“)
答案 0 :(得分:1)
卢卡的回答应该可以解决你的问题。我想分享一下我通常如何实现AJAX POST请求。我在模板(html)文件中编写了jQuery代码。
我知道这不是最佳做法,但这样做可以让我
使用{% url %}
标记,而不是对js文件中的网址进行硬编码。
使用{{ csrf_token }}
而不是从中获取值
隐藏输入字段。
通常情况下,我的 base.html 文件中有一个名为extrajs的块(我在每个模板上扩展了一个块)。
现在每当我需要包含AJAX功能时,我就是这样做的
{% block extrajs %}
<script>
...
$.ajax({
...
url:'{% url "app_name.views.func_name" %}',
data:{ ... ,'csrfmiddlewaretoken':'{{ csrf_token }}', ... },
...
});
</script>
{% endblock %}
答案 1 :(得分:0)
我的建议是你应该确保csrf token关键字与处理它的中间件内联(在你的ajax中是csrtoken
)。在我的django应用程序中,令牌称为csrfmiddlewaretoken
。
ajax post请求应如下所示:
$.ajax({
type:"POST",
url: "http://127.0.0.1:8000/search/",
data:{'search_text':cadena,
'csrfmiddlewaretoken' : csrf},
success:function(respuesta){
$('#search-results').html(respuesta);
}