Django и AJAX — replaceWith не заменяют мой элемент, он добавляет его, а не удаляет оригинал

#jquery #django #ajax #replacewith

#jquery #django #ajax #заменяют с

Вопрос:

Я выполняю вызов AJAX в своем приложении django для обновления данных на странице без обновления. Когда я отправляю запрос AJAX и использую replaceWith() элемент, который я пытаюсь заменить, добавляется на страницу, но не заменяет оригинал.

Упрощенный код:

page.html

 <table>
   {% for form in formset %}
    <tr>
        <td>{{form.evidence}}</td>
        {% include 'detail.html' %}
   </tr>
    {% endfor %}
</table>
  

detail.html

 {% if obj %}

    {% if updated  %}

        <td id='{{obj.id}}-detail' colspan=2>Updated</td>

    {% else %}

        <td id='{{obj.id}}-detail'>not updated</td>

        {% include 'save_container.html' %}            

    {% endif %}


{% else %}

    {% include 'save_container.html' %}

{% endif %}
  

save_container.html

 <div class='btn-group mr-1 mb-1'>
  <button id='{{ form.instance.id }}-save-button' action="{% url 'results:save_class' %}"
      type='button' class="btn btn-warning save-classification">Save</button>
</div>     
  

views.py

     def save_class(request):

        data = dict()

        if request.method == 'POST' and request.is_ajax():

            obj = Table.objects.get(id=request.POST['id'])
            form = Form(data=request.POST, instance=obj, saved=True)

            if form.is_valid():

                ... save form to table ...


                data['form_is_valid'] = True

                obj = VariantClassification.objects.get(id=obj.id)

                data['html_detail'] = render_to_string(
                    'details.html',
                    {'obj': obj,
                    'updated': True
                    })

            else:
                data['form_is_valid'] = False
                data['form_errors'] = form.errors.values()


            return JsonResponse(data)
  

save.js

 $(function () {
    $(".save-classification").click(function () {
        var id = $(this).attr('id').replace('-save-button','');

        var url = $(this).attr('action');
        var var_n = $(this)

        var evidence = $(this).closest("tr").find("td."   id   '-evidence-cell').find("li.evidence-cohort-li").find("input.textinput").val();

        // some validation...

        data = {
            id: id,
            evidence: evidence,
            save: true,
        }

        $.ajax({
          url: url,
          type: 'post',
          data: data,
          dataType: 'json',
          success: function (data){
              if (data.form_is_valid) {
                console.log('Save variant form is valid')
                console.log(data['variant_classification_id'])

                var cell = $('#'.concat(data['variant_classification_id']
                  ).concat('-detail'))

                cell.replaceWith(data.html_detail);

              } else {
                alert('Form is not valid. '.concat(data['form_errors']).concat(
                  ' Please save any other classified variants and then refresh the page to continue.'))
                // if(confirm('Form is not valid. '.concat(data['form_errors']))){
                //       window.location.reload();
                //   }
              }
          },
          error: function () {
              console.log('Error: Not saved with AJAX')
          },

        });
        return false;

    });
});
  

Итак, я пытаюсь заменить содержимое тега в detail.html с новым содержимым html_detail, которое должно обновить obj.updated=True, и, следовательно, отображать обновленный только как показано ниже в detail.html:

     {% if obj.updated  %}
        <td id='{{obj.id}}-detail' colspan=2>Updated</td>
    {% else %}
        <td id='{{obj.id}}-detail'>not updated</td>
        {% include 'save_container.html' %}          
    {% endif %}
  

Однако страница обновлена, чтобы иметь оба вышеуказанных тега, т. е:

         <td id='{{obj.id}}-detail' colspan=2>Updated</td>
        <td id='{{obj.id}}-detail'>not updated</td>
        {% include 'save_container.html' %}         
  

Как я могу полностью заменить не обновленный тег в detail.html используя obj.updated = True после завершения вызова AJAX и проверки формы?

Комментарии:

1. Можете ли вы попробовать вот так -> var_n.closest('tr').find(cell).html(data.html_detail)

2. куда я могу это поместить?

3. вместо этого cell.replaceWith(data.html_detail); поместите выше и посмотрите.