javascript - 从 ajax POST 方法获取数据后,在 django 中打开另一个窗口
问题描述
我想在视图中传递数据并在 window.open("{% url 'view_detail' %}", "_self") 中打开另一个 html 文件,当我使用 ajax 时它在视图中成功发布数据,现在我必须打开这个url,当我使用这种语法 window.open("{% url 'view_detail' %}", "_self") 时,它会转到相同的函数并且什么都不返回,我应该如何避免这种情况,.js 文件
<script>
function myFunction() {
console.log("======")
$('#NextButton').on('click', function ()
{
console.log('After Clicking Next Buttton')
$.ajax({
url : "/analytics/show_analytics/",
type : "POST",
async: true,
data : {
industry: $("input[name='analyticsindustry']:checked").val(),
domain: $("input[class='analyticsdomain']:checked").val(),
functions: $("input[class='analyticsfunctions']:checked").val(),
csrfmiddlewaretoken: '{{ csrf_token }}',
},
success : function(data) {
var c = document.getElementById('domaincheckbox2').value;
alert(data)
window.open("{% url 'show_analytics', '_self' %)}")
show_a(data)
}
})
return false;
})
}
</script>
视图.py
def show_analytics(request):
cursor = connection.cursor()
#posts = analyticsreport.objects.values('Domain', 'Analytics').distinct()
#print('POSTS', posts)
total_analytics = []
if request.method == 'POST':
industry = request.POST.get('industry')
domain = request.POST.get('domain')
functions = request.POST.get('functions')
print("Industry", industry)
print("Domain", domain)
print("Functions", functions)
#total_analytics = []
query = ('select id, Analytics from analytics_analyticsreport where Industry = ' + "'" + industry + "'")
result = analyticsreport.objects.raw(query)
print(len(result))
print(result)
for i in range(len(result)):
analytics = result[i].Analytics
print('Analytics', analytics)
if analytics not in total_analytics:
total_analytics.append(analytics)
print('Total_Analytics', total_analytics)
return render_to_response('analytics/demo.html', {'posts': total_analytics})
我要显示的 html 文件
{% extends 'analytics/layout.html' %}
{% block content %}
<div class="col-lg-12 col-md-12 col-sm-12">
<!-- New Chart Comes Here --->
<div class="card card-stats">
<div class="card-body ">
<div class="card-header ">
<!--div class="progress-container progress-info"-->
<h6 class="card -title" style="color:#FFFFFF; background-color:#008B8B;" align="center"> Choose Analytics </h6>
{% for post in posts %}
<p>
<input type="checkbox" id="checkbox_1" name = "analytics" value= {{post}} style="margin-left:10px;"> {{post}}
</p>
{% endfor %}
</div>
</div>
</div>
<div class="col-lg-16 col-md-16 col-sm-20" style="float:right;">
</div>
<div class="col-lg-16 col-md-16 col-sm-20" style="float:right;">
<button type="button" id="button_for_previous" class="myPreviousFunction"> Previous </button>
<button type="button" id="button_for_proceed1" class="myNextFunction1"> Proceed For Next</button>
</div>
</div>
{% endblock content %}
解决方案
您的 ajax 正在向您的show_analytics
Django 视图发布一些数据。该视图返回一个 HTML 文档,其中包含您想要的数据,但您没有对此做任何事情。取而代之window.open()
的是show_analytics
视图(它提交了一个新请求,这次是 GET),并返回没有任何数据的 HTML 文档,因为您永远不会进入if request.method == 'POST'
代码。
由于您没有更改后端的任何内容(不保存到数据库),因此您无论如何都不必使用 POST。你想要的是:
- 将视图更改
show_analytics
为仅处理 GET 请求并检查request.GET
参数。 - 将“下一步”按钮更改为常规链接
<a href="{% url 'show_analytics' %}>
- 更改您的 javascript 以将所选参数附加到链接的 href 属性,因此每次用户更改输入值时,链接将变为
/show_analytics?analyticsdomain=something&analyticsindustry=myplace
:
var baseURL = {% url 'show_analytics' %}; // at the beginning of your script, assuming it's inside your template
// then when user input changes
var newURL = baseURL + "?analyticsindustry=" + $("input[name='analyticsindustry']:checked").val();
然后当用户单击按钮时,就像单击常规链接一样,它将向您的视图发出 GET 请求。
最后作为旁注:您的原始数据库查询很危险并且容易发生 SQL 注入,因为您没有清理输入值。您只需获取用户提交的原始字符串并将其注入您的查询。这是非常糟糕的做法!
推荐阅读
- python - 与 tensorflow 一起导入时出现 Numpy 错误
- pandas - 传递参数时重命名轴错误的 Pandas 错误
- sql-server - 如何安排在 SQL Server 上运行 SQL 脚本?
- c++ - 使用 FreeType 加载彩色字体
- javascript - 在新选项卡中呈现静态内容(express、ejs)
- sql-server - SSIS 包工作,但创建表时作业失败
- c# - .NET MVC 控制器 void 操作在 Chrome 中返回空文件,而不是在 Firefox 中
- mongodb - 除以零会在 mongodb 聚合上产生错误
- scala - Scala - 方法 X 什么都不覆盖
- node.js - 节点 Elasticsearch 批量索引静默失败