Прежде всего, я точно знаю, что в коде нет конечного http
, и у моего nginx-сервера нет явной ошибки конфигурации. Я считаю эту проблему очень странной:Ошибка смешанного содержимого при загрузке представления из HttpResponse() в ajax
У меня есть главный вид с разными вкладками, каждый из которых обслуживается CBV. Например, я называю содержимое вкладки company
с этим HTML код:
<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.
Я должен уточнить, что представление обновления корректно выполняет свою работу при обновлении данных. Это действительно проблема возврата детали CBV.
Это ошибка? Я делаю неправильно с js (конечно)? Почему js может загружать детали CBV в случае (загрузочные вкладки), а не после обновления (поскольку это строго одно и то же представление)? Почему протокол URL изменяется?
NB: Я попытался установить SECURE_PROXY_SSL_HEADER и SECURE_SSL_REDIRECT в настройках django без успеха. (Я упал в петлю бесконечного перенаправления).