从 ajax 中的 HttpResponse() 加载视图时出现混合内容错误

Mixed content error in loading a view from an HttpResponse() in ajax

首先,我确定代码中没有尾随 http 并且我的 nginx 服务器没有明显的配置错误。我觉得这个问题很奇怪:

我得到了一个包含不同选项卡的主视图,每个选项卡都由 CBV 提供。例如,我用 HTML 代码调用 company 选项卡的内容:

<li class="">
<a href="{% url "staffpanel:companies:company_detail" company.pk %}" id='companyTab' data-toggle="tab">{% trans "Company" %}</a>
</li>

它自然会调用这个加载到选项卡内容 <div id="tabContent"></div> 中的视图,代码如下:

class CompanyDetail(StaffPanelMixin, DetailView):
    model = Company
    template_name = "staffpanel/companies/_company.html"

和以下js:

$('a[data-toggle="tab"]').on('show.bs.tab', function (event){
    var tab = $(event.target).attr("id");
    var action = $(event.target).attr("href");
    $.get(action, null, function( data ) {
        $("#tabContent").html( data );
    });
    return false;
});

在每个选项卡上,我都可以将表单打开到模式块中。此表单调用更新 CBV,让用户编辑选项卡中显示的对象。更新视图验证如下:

class CompanyUpdate(StaffPanelMixin, UpdateView):
     template_name = "staffpanel/companies/_company_form.html"
     model = Company
     form_class = CompanyUpdateForm

     def get_success_url(self):
         return reverse("staffpanel:companies:company_detail",
                        args=(self.object.pk,))

目前,一切都很好。如果表单无效,数据将以包含在模态块中的表单正确返回,并按预期显示带有消息错误的表单。感谢这段代码:

$(document).on('submit', '#companyForm', function () {
    var form = $('#companyForm');
    var actionUrl = form.prop('action');
    var modal = $('#genericModal');

    ajaxform(new FormData(form[0]), modal, actionUrl);
    return false;
});

function ajaxform(formData, modal, actionUrl) {
    $.ajax({
        url: actionUrl,
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function (data) {
            if (($(".has-error", data).length != 0) || ($(".alert", data).length !=0 )) {
               $(".modal-content").html( data )
            }
            else {
                modal.modal('hide');
                $("#tabContent").html( data );
            }
        }
    });
}

问题与成功消息一起出现。虽然它在无效表单的情况下工作正常,但未能成功加载 url 并引发混合内容错误并查找具有错误协议的视图。我正在使用 SSL,它使用 HTTP 而不是 HTTPS 调用详细信息视图。

我必须明确更新视图在更新数据时正确地完成它的工作。真是返回detail CBV的问题

这是一个错误吗?我在 js 上做错了吗(当然)?为什么 js 可以在案例中(加载选项卡)而不是在更新之后加载详细信息 CBV(因为这与调用的视图完全相同)?为什么 url 协议会顺便更改?

注意:我尝试在 django 设置中设置 SECURE_PROXY_SSL_HEADER 和 SECURE_SSL_REDIRECT 但没有成功。 (我陷入了无限重定向的循环)。

看来我无法直接加载页面而没有这个令人痛苦的混合内容问题(由于 HttpResponse() 导致 HTTP 中的 HTTPS 更改)。

所以我的解决方案是 return 包含 success_url 的 JsonResponse 然后我能够从 js 选项卡加载。

我在我的更新视图中覆盖了 form_valid 如下:

 def form_valid(self, form);
      super().form_valid(form)
      return JsonResponse({'succes_url': self.get_success_url()})

并且在我的 ajax 调用中,我必须替换这一行:

 $("#tabContent").html( data );

这个:

 $("#tabContent").load( data['success_url'] );

就是这样。

希望对您有所帮助!