首页 > 解决方案 > 从 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 %}

标签: javascripthtmldjangopython-3.x

解决方案


您的 ajax 正在向您的show_analyticsDjango 视图发布一些数据。该视图返回一个 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 注入,因为您没有清理输入值。您只需获取用户提交的原始字符串并将其注入您的查询。这是非常糟糕的做法!


推荐阅读