【问题标题】:XMLHttpRequest Synchronous Error in Bootstrap modal and DjangoBootstrap 模式和 Django 中的 XMLHttpRequest 同步错误
【发布时间】:2018-11-26 11:46:20
【问题描述】:

程序打开Bootstrap Modal并加载Django Form以创建新权限,这是可行的。但是当我想在表单中添加新的 Ajax 调用以在 Django ChoiceField 中动态加载元素时出现错误并且浏览器永远不会完成调用。

我打开浏览器检查控制台并出现 XMLHttpRequest 错误

url.py:

path('permisos/', general_views.permission_list,name='permission_list'),
path('permisos/crear', general_views.permission_create, name='permission_create'),
path('permisos/<int:id>/editar', general_views.permission_update, name='permission_update'),
path('permisos/<int:id>/detalle', general_views.permission_detail, name='permission_detail'),
path('permisos/<int:id>/borrar', general_views.permission_delete, name='permission_delete'),

path('permisos/crear/cargar_elementos/', general_views.permission_load, name='ajax_load_permissions'),

永远不能从 ajax 调用这个函数

views.py:

def permission_load(request):
  type = request.GET.get('type')

  if type == 2: # object
    list = ['general', 'billing', 'accounting']
    elements = ContentType.objects.filter(app_label__in=list)

  elif type == 3: # instance
    list = ['general', 'billing', 'accounting']
    content_type = ContentType.objects.filter(app_label__in=list)
    elements = general_models.content_type.model.objects.all()

  elif type == 4: # attribute
    list = ['general', 'billing', 'accounting']
    content_type = ContentType.objects.filter(app_label__in=list)
    elements = general_models.content_type.model.objects.all()
    # get instance atributtes

  else: # module
    elements = general_models.Modules.objects.all()

  # other aspect is that i dont know how to load view result in the html choicefield

  response = { 'element': elements }
  json = simplejson.dumps(response)
  return HttpResponse(json, mimetype="text/json")

forms.py:

class CustomPermisisonForm(forms.Form):
  name = forms.CharField()

  ACTION_TYPE = ((1, ('Ver')),(2, ('Añadir')),(3, ('Modificar')),(4, ('Borrar')))
  action = forms.MultipleChoiceField(choices=ACTION_TYPE, label='Acciones', initial=1, widget=forms.SelectMultiple())

  PERMISSION_TYPE = ((1, ('Módulo')),(2, ('Objecto')),(3, ('Instancia')),(4, ('Atributo')))
  type = forms.ChoiceField(choices=PERMISSION_TYPE, label='Tipo', initial=1, widget=forms.Select(attrs={"data-objects-url":"{% url 'ajax_load_permissions' %}"}))

  element = forms.ModelChoiceField(queryset=general_models.Module.objects.all())

permissions.html:

{% block javascript %}
  <script src="{% static 'js/permissions.js' %}"></script>
{% endblock %}

# this is the line to open modal
<button type="button" onclick="return openModalPermission('{% url 'general:permission_create' %}')" class="btn btn-outline-primary float-right btn-sm">
  <span class="fas fa-plus"></span>
</button>

permission_create.html:

{% load static %}

<div class="modal-dialog modal-lg">
  <div class="modal-content">
    <form method="POST" action="{% url 'general:permission_create' %}">
      {% csrf_token %}
      <div class="modal-header">
        <h4 class="modal-title">Nuevo Permiso</h4>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        {% include 'permission_form.html' %}
      </div>
      <div class="modal-footer">
        <button type="submit" class="btn btn-primary">Crear</button>
      </div>
    </form>
  </div>
</div>

# when comment this line the error disappear but don't work js call
<script src="{% static 'js/permissions.js' %}"></script>

permission_form.html:

{% load widget_tweaks %}
{% load static %}

{% for field in form %}
  <div class="form-group{% if field.errors %} has-error{% endif %}">
    <label for="{{ field.id_for_label }}">{{ field.label }}</label>
    {% render_field field class="form-control" %}
    {% for error in field.errors %}
      <p class="help-block">{{ error }}</p>
    {% endfor %}
  </div>
{% endfor %}

permissions.js:

function openModalPermission(url) {
  $('#modal-permission').load(url, function() {
    $(this).modal('show');
  });
  return false;
}

$("#id_type").change(function () {
  console.log("js function");
  var url = $("id_type").attr("data-objects-url");
  var type = $(this).val();
  console.log(type);
  console.log(url);
  $.ajax({
    url: url,
    data: {
      'type': type
    },
    success: function (data) {
      $("#id_element").html(data);
    },
    error: function (qXHR, textStatus, errorThrown) {
      console.log(qXHR)
      console.log(textStatus)
      console.log(errorThrown)
    }
  });
  return false;
});

有人知道如何解决这个问题吗? 提前致谢。

【问题讨论】:

  • 请从控制台发布确切的错误消息。 "but don't work js call" 到底是什么意思?您在控制台中看到"js function" 了吗?如果不是,那么我猜当您要添加 change 处理程序时,DOM 中没有 ID 为 id_type 的元素。
  • 这是确切的错误:Un XMLHttpRequest síncrono en el hilo principal está desaprobado por sus efectos negativos en la experiencia del usuario final。 Para más ayuda vea xhr.spec.whatwg.org 并在单击 permission.html 中的添加按钮时出现在浏览器检查控制台中
  • “主线程中的同步 XMLHttpRequest 因其对最终用户体验的负面影响而被弃用。” - 这不是错误,而是弃用警告 i>.
  • “js 函数”消息没有出现
  • 编辑问题使其不再显示问题对未来的读者没有帮助。回滚您的更改并将解决方案添加为答案,回滚更改并接受重复或删除问题。但是你真的应该回滚所做的更改。

标签: javascript ajax django django-forms xmlhttprequest


【解决方案1】:

已解决

permissions.html:

<!-- pass this block to the end of the file -->
{% block javascript %}
  <script src="{% static 'js/permissions.js' %}"></script>
{% endblock %}

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2018-09-09
    相关资源
    最近更新 更多