请帮助解决问题。
HTML:
<div class="modal fade" id="commonModal" tabindex="-1" role="dialog" aria-labelledby="commonModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
<h4 class="modal-title" id="commonModalLabel">Modal title</h4>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default but_cancel" data-dismiss="modal">Отменить</button>
<button type="button" class="btn btn-primary but_ok" data-dismiss="modal">Ok</button>
</div>
</div>
</div>
</div>
我按如下方式发送ajax请求:
$('#commonModalLabel').text('Удалить профиль?');
$('#commonModal .modal-body').html('Возможность восстановить профиль будет доступна в течение двух недель. Для восстановления нужно отправить <a href="mailto:prozaik81-2@yandex.ru">администратору</a> ресурса письмо с почтового адреса, который был указан в профиле.');
$('#commonModal').modal('show');
$('#commonModal .but_ok').on('click', function(){
console.log('ok');
$.ajax({
url: "/accounts/delete_profile/",
type: 'POST',
dataType:"json",
data: {},
success: function(data) {
if(data.result == true){
$('#mySmallModalLabel').text('Профиль удалён');
$('#infoModal').modal('show');
}
}
});
});
views.py:
def delete_profile(request):
result = False
if request.method == "POST" and request.is_ajax():
username = request.POST.get('username', '')
try:
entry = User.objects.get(username=username)
entry.is_active = 0
entry.save()
except:
pass
else:
result = True
data = {
'result': result,
}
return HttpResponse(json.dumps(data), content_type='application/json')
问题是在日志中出现以下错误消息:
禁止访问(CSRF令牌丢失或不正确。): /账户/ delete_profile /
如果是表单,我会按如下方式发送令牌:
{% csrf_token %}
但在我的情况下没有形式(!)。请告诉我在哪里获得令牌以及如何发送
答案 0 :(得分:1)
将其放入您的AJAX请求中。
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
},
有时它在某些浏览器中不起作用(在我的情况下是chrome),因此您可以将这些添加到您要发送到的数据中查看:
data['csrfmiddlewaretoken'] = $.csrf_token;
$.csrf_token
对我来说是一个全局对象,我将令牌直接打印到模板:
<script type="text/javascript">
$.csrf_token = '{{ csrf_token }}';
</script>
答案 1 :(得分:0)
您的问题在django docs。
中有解释请注意,如果没有呈现任何表单,django可能不会发送csrf令牌,则必须使用ensure_csrf装饰器