我是一个初学者,正在研究一个应用程序,该应用程序在检查是否保存了任何内容后,希望将用户重定向到结帐篮(通过POST生成Django url?还是使用变量渲染html模板?)localStorage
。因此,我检查并使用AJAX将数据发送到我的Django网址,以呈现通过JSON传递localStorage中的变量的模板。
但是return render(request, "pizza/prebasket.html", context)
inviews.py
无效:即使已接收数据,prebasket.html
也不会呈现。我读到那是因为AJAX不允许这样做,而我需要通过AJAX的回调函数进行发布。但是,如何通过POST
该操作以及如何将参数传递给视图或直接传递给html模板呢?(window.location.href
仅处理GET
请求,因此我认为这不起作用)。
这是我的JavaScript和我的views.py
:
function previous_selection () {
if (localStorage.getItem("preselection") != null) {
const data = new FormData();
data.append("preselection", preselection);
const request = new XMLHttpRequest();
request.open('POST', '/prebasket');
const csrftoken = getCookie('csrftoken');
request.setRequestHeader("X-CSRFToken", csrftoken);
console.log("DATA IS: ", data);
request.send(data);
console.log("PRESELECTION IS: ", preselection);
request.onload = () => {
// HOW DO I CALL MY URL WITH PARAMETERS HERE?
};
return false;
}
}
previous_selection();
在views.py
:
@login_required
def prebasket(request):
q_preseletion = request.POST.dict()
preselection = json.loads(q_preselection["preselection"])
items = []
# logic iterates thru items to provide 'context'
context = {"items": items}
if request.is_ajax():
html = render_to_string('pizza/prebasket.html', {'items': items})
return HttpResponse(html)
return render(request, "pizza/prebasket.html", context)
如果要获取AJAX调用返回的页面内容prebasket
,可以创建一个伪造的HTML文档,并将返回的HMTL放入其中,然后获取所需的元素,并将其放入当前页面的容器中。
我不确定onload
支持的范围如何,因此从安全的角度来看,这是回调到onreadystatechange
:
request.onreadystatechange = () => {
if(request.readyState === XMLHttpRequest.DONE){
let status = request.status;
if (status === 0 || (status >= 200 && status < 400)) {
const basket = document.getElementById('basketContainer');
let parser = new DOMParser();
const fakePage = parser.parseFromString(request.responseText, "text/html")
const frm = fakePage.getElementById('basket');
basket.appendChild(frm);
}
}
};
假设您要进行AJAX调用的页面上有空格或篮子,例如
<div id="basketcontainer">
</div>
然后,您需要将与购物篮相关的CSS添加到同一页面中。您可能需要有条件地限制display:none
购物篮容器,以防它与页面的形状混淆。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句