2016-02-11 4 views
0

Прежде всего, я точно знаю, что в коде нет конечного 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 без успеха. (Я упал в петлю бесконечного перенаправления).

ответ

0

Похоже, что я не смог загрузить непосредственно страницу без этой болезненной проблемы с смешанным контентом (изменение HTTPS в HTTP из-за HttpResponse()).

Итак, мое решение состояло в том, чтобы вернуть JsonResponse, содержащий success_url, а затем я смог загрузить с 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']); 

и все.

Надеюсь, это поможет!