根据 jQuery 发起的 AJAX POST 请求重新渲染 Django 视图
Re-render Django view based on jQuery-initiated AJAX POST request
我面临的问题与根据由 jQuery 发起的 AJAX post 请求更新的上下文重新呈现 Django 视图有关。我之所以需要一个AJAX请求是因为我需要在不刷新页面的情况下修改页面UI,这对我要构建的东西很关键。
到目前为止,我能够触发 AJAX post 对应该发生更新的同一页面的 URL 的请求,以及 Django view.py
充分注册它已被调用。 然而,虽然我可以重现更新 Django 视图上下文的能力,但该视图似乎不会根据更新的上下文重新呈现更新的 HTML。
的帖子似乎准确描述了我的问题。该线程的最高投票解决方案是有一个条件,仅在 AJAX 调用仅呈现部分模板( 而不是 完整 HTML page) - 与要更新的组件相对应的部分模板。这是在下面的代码片段中重现的内容,但 HTML 不会根据更新的上下文进行更改。
附件是用于简单尝试的相关代码片段,其中页面默认显示 <h1>2<h1/>
,并且当我们单击 window 上的任意位置时将更新为 5。单击 window 上的任意位置会触发 AJAX 调用,但页面不会更新为 <h1>5<h1/>
。
view.py
def index(request):
context = {"num": 2}
if (request.method == "POST"):
print("View hit due to AJAX call!") # // THIS CAN BE TRIGGERED ADEQUATELY!
context["num"] = 5
return render(request, 'num.html', context)
return render(request, 'override.html', context)
override.html
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="{% static 'js/num.js' %}" defer></script>
<title>Title</title>
</head>
<body class="">
<div class="">
{% include 'num.html' %}
</div>
</body>
</html>
num.html
<h1>{{ num }}</h1>
num.js
var postUrl = "http://localhost:8000/";
function getCSRFToken() {
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]);
if (cookie.substring(0, 10) == ('csrftoken' + '=')) {
cookieValue = decodeURIComponent(cookie.substring(10));
break;
}
}
}
return cookieValue;
}
$('html').click(function(){
values = [1, 2];
var jsonText = JSON.stringify(values);
$.ajax({
url: postUrl,
headers: { "X-CSRFToken": getCSRFToken(), "X-Requested-With": "XMLHttpRequest" },
type: 'POST',
data: jsonText, // note the data, jsonText, does not really matter. The Django context gets updated to 5 instead of 2.
traditional: true,
dataType: 'html',
success: function(result){
console.log("AJAX successful") // THIS CAN BE TRIGGERED ADEQUATELY!
}
});
});
如果这部分代码
success: function(result){
console.log(result)
}
打印 num.html 的内容 你可以更改 num.html 以获取 h1 id 为
num.hml
<h1 id="numberToChange">{{ num }}</h1>
在你的 num.js
$('html').click(function(){
values = [1, 2];
var jsonText = JSON.stringify(values);
$.ajax({
url: postUrl,
headers: { "X-CSRFToken": getCSRFToken(), "X-Requested-With": "XMLHttpRequest" },
type: 'POST',
data: jsonText, // note the data, jsonText, does not really matter. The Django context gets updated to 5 instead of 2.
traditional: true,
dataType: 'html',
success: function(result){
document.getElementById("numberToChange").innerHTML = result}
});
});
我面临的问题与根据由 jQuery 发起的 AJAX post 请求更新的上下文重新呈现 Django 视图有关。我之所以需要一个AJAX请求是因为我需要在不刷新页面的情况下修改页面UI,这对我要构建的东西很关键。
到目前为止,我能够触发 AJAX post 对应该发生更新的同一页面的 URL 的请求,以及 Django view.py
充分注册它已被调用。 然而,虽然我可以重现更新 Django 视图上下文的能力,但该视图似乎不会根据更新的上下文重新呈现更新的 HTML。
附件是用于简单尝试的相关代码片段,其中页面默认显示 <h1>2<h1/>
,并且当我们单击 window 上的任意位置时将更新为 5。单击 window 上的任意位置会触发 AJAX 调用,但页面不会更新为 <h1>5<h1/>
。
view.py
def index(request):
context = {"num": 2}
if (request.method == "POST"):
print("View hit due to AJAX call!") # // THIS CAN BE TRIGGERED ADEQUATELY!
context["num"] = 5
return render(request, 'num.html', context)
return render(request, 'override.html', context)
override.html
{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="{% static 'js/num.js' %}" defer></script>
<title>Title</title>
</head>
<body class="">
<div class="">
{% include 'num.html' %}
</div>
</body>
</html>
num.html
<h1>{{ num }}</h1>
num.js
var postUrl = "http://localhost:8000/";
function getCSRFToken() {
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]);
if (cookie.substring(0, 10) == ('csrftoken' + '=')) {
cookieValue = decodeURIComponent(cookie.substring(10));
break;
}
}
}
return cookieValue;
}
$('html').click(function(){
values = [1, 2];
var jsonText = JSON.stringify(values);
$.ajax({
url: postUrl,
headers: { "X-CSRFToken": getCSRFToken(), "X-Requested-With": "XMLHttpRequest" },
type: 'POST',
data: jsonText, // note the data, jsonText, does not really matter. The Django context gets updated to 5 instead of 2.
traditional: true,
dataType: 'html',
success: function(result){
console.log("AJAX successful") // THIS CAN BE TRIGGERED ADEQUATELY!
}
});
});
如果这部分代码
success: function(result){
console.log(result)
}
打印 num.html 的内容 你可以更改 num.html 以获取 h1 id 为
num.hml
<h1 id="numberToChange">{{ num }}</h1>
在你的 num.js
$('html').click(function(){
values = [1, 2];
var jsonText = JSON.stringify(values);
$.ajax({
url: postUrl,
headers: { "X-CSRFToken": getCSRFToken(), "X-Requested-With": "XMLHttpRequest" },
type: 'POST',
data: jsonText, // note the data, jsonText, does not really matter. The Django context gets updated to 5 instead of 2.
traditional: true,
dataType: 'html',
success: function(result){
document.getElementById("numberToChange").innerHTML = result}
});
});