我正在编写只有一页的django网络应用程序。此页面包含带有一些输入的表单。当我单击提交按钮时,我对python中的函数进行了ajax调用。我想从该函数取回一些数据。
HTML文件:
<form id="strategy" method="post" class="edit_user">
{% csrf_token %}
<div class="sel-schedule">
<label>Label: </label>
<input id="start_time" type="time" name="start_time" value="09:30" required>
</div>
<button type="submit" class="inactive boton-lanzar">Launch</button>
</form>
JS文件:
$('#strategy').on('submit', function(event){
var start_time = document.getElementsByName("start_time")[0].value;
var url = '/method_calculation/';
$.ajax(url, {
data: {
'start_time': start_time,
},
dataType: 'json',
success: function (data) {
console.log("new")
}
})
});
网址文件:
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('method_calculation/', method_calculation, name="method_calculation"),
]
查看文件:
def home(request):
if request.method == "GET":
return render(request, 'index.html')
else:
return HttpResponse("OK")
def method_calculation(request):
if request.method == 'POST':
start_time_hour = int(request.POST.get('start_time')[0:2])
start_time_minute = int(request.POST.get('start_time')[3:5])
data_comparison = caculate_summit(start_time_hour, start_time_minute)
args = {data_comparison}
return JsonResponse(args)
我有点困惑。
首先,我不希望页面重新加载,但是如果我取出返回的HttpResponse,它说它需要它。
第二,使用当前文件,我得到以下错误:
The view myapp.views.method_calculation didn't return an HttpResponse object. It returned None instead.
我想念什么?
非常感谢
答案 0 :(得分:1)
您的AJAX调用正在发出GET请求,并且view函数无法处理这种情况。结果,它返回None
,从而返回错误。
因此,您需要在$.ajax
调用中指定请求类型:
$.ajax(url, {
type: "POST",
data: {
start_time: start_time,
csrfmiddlewaretoken: '{{ csrf_token }}'
},
dataType: 'json',
success: function (data) {
console.log("new")
}
})
根据您的评论,您还需要指定CSRF令牌(鉴于JavaScript是用模板呈现的,上面的方法应该可以使用)。
答案 1 :(得分:1)
当我在Django项目上的Ajax中执行发布请求时,这就是我正在做的事情。 根据django文档(https://docs.djangoproject.com/en/2.1/ref/csrf/),获取csrf令牌的最佳方法是使用此函数:
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
我用以下代码构建了一个ajax发布函数:
function postAjaxJson(url, data, is_csrf, callback) {
if (is_csrf) {
var csrftoken = getCookie('csrftoken');
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
}
$.ajax({
url: url,
type: "POST",
contentType: "application/json",
data: JSON.stringify(data),
success: function(response) {
callback(response);
},
error: function () {
console.error("Erreur réseau avec l'url" + url);
}
})
}
我通常以JSON发送数据。 而且,在您看来,您会在 request.body 中找到ajax帖子中的数据,而不是在request.POST中找到数据:
import json
def method_calculation(request):
if request.body:
...
# if json data = json.loads(request.body)
...
return JsonResponse(args)
我希望这可以帮助您解决问题!