удаление объектов без обновления django - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь удалить выбранные объекты в django, это работает, но когда я выбираю элемент, затем нажимаю кнопку «Удалить», он не удаляется, а после обновления страницы обновляется выбранный объект.Вот

views.py

@login_required
def delete_contact(request):
    if request.is_ajax():
        selected_contacts = request.POST['contact_id']
        selected_contacts = json.loads(selected_contacts)

        for i, contact in enumerate(selected_contacts):
            if contact != '':
                ClientContact.objects.filter(author_id__in=selected_contacts).delete()
        return redirect('contacts')

в шаблонах

                 <table class="table table-hover contact-list">
                    <thead>
                    </thead>
                    {% for contact in contacts %}
                        <tbody>
                        <tr data-id="{{ contact.id }}" class="clickable-row"
                            data-href="{% url 'contact-detail' contact.id %}"
                            style="cursor: pointer; ">
                            <th scope="row"><input type="checkbox" id="check"></th>
                            <td>{{ contact.client_name }}</td>
                            <td>{{ contact.client_company_name }}</td>
                            <td>{{ contact.email }}</td>
                            <td>{{ contact.work_phone }}</td>
                            <td>{{ contact.work_phone }}</td>
                        </tr>
                        </tbody>
                    {% endfor %}
                </table>
                {% csrf_token %}
            </div>
        </div>
    </div>
</div>

{% include 'users/footer.html' %}

<script type="text/javascript">
    $(document).ready(function () {
        $(".delete-btn").click(function () {

            var selected_rows = [];

            $('.contact-list').find('tr').each(function () {
                var row = $(this);
                if (row.find('input[type="checkbox"]').is(':checked')) {
                    console.log(row.attr('data-id'));
                    selected_rows.push(row.attr('data-id'));
                }

            });
            var selected_rows = JSON.stringify(selected_rows);
            $.ajax({
                url: "{% url 'contact-delete' %}",
                type: 'POST',
                data: {
                    'contact_id': selected_rows,
                    'csrfmiddlewaretoken': $("[name=csrfmiddlewaretoken]").val()
                },
            });
        });
    });
</script>

работает нормально но с обновлением страницы.Как я могу удалить выбранные объекты, как только я нажму кнопку удаления.Любая помощь, пожалуйста?Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Вы удаляете объекты, чего вам не хватает, так это того, что после отправки запроса в Django, если запрос выполнен успешно, вам необходимо соответствующим образом обновить HTML.

HTML-код вашей страницы отображается, когда вызапросить мнение.На этом этапе цикл for в вашем шаблоне выполняется и выполняет итерации по всем существующим контактам

{% for contact in contacts %}               
{% endfor %}

Впоследствии, когда пользователь нажимает кнопку удаления, запрос отправляется через AJAX в Django, который эффективно удаляет выбранные объекты.HTML-код не обновляется автоматически.Когда вы обновляете страницу, Django снова выполняет код шаблона и, таким образом, цикл for запускается снова, но на этот раз список контактов изменился, поэтому вы видите изменения в этом случае.

Выможет решить вашу проблему по-разному:

1) Вместо вызова представления Django через AJAX создайте правильную форму HTML + Django, которая публикуется в представлении Django, которое после обработки формы снова перенаправляет в то же представление,Это не потребует Javascript или AJAX.Вы можете узнать больше о формах здесь .Таким образом, ваш шаблон перерисовывается после каждого сообщения, и поэтому вы увидите, что ваша таблица обновлена.

2) Вероятно, наихудший вариант, но также самый простой в реализации на данный момент, - обновить страницучерез Javascript после успешного возврата AJAX-запроса.Для этого вы можете привязать функцию к свойству success вашего вызова $.ajax, которая вызывает обновление, что-то вроде location.reload();.Обратите внимание, что это неправильный выбор, поскольку вы прилагаете все усилия, чтобы вызвать представление удаления с помощью AJAX, но не получаете никаких его преимуществ, получая только худшее из обоих миров.

3) Третийопция заключается в том, чтобы отредактировать ваш HTML (на самом деле ваш DOM), используя JavaScript, когда вызов AJAX успешно возвращается.Если вы решите пойти по этому пути (как я и предполагаю), и не знаете, как это сделать, я предлагаю вам опубликовать еще один вопрос, касающийся, в частности, как изменить отображаемый HTML-код с помощью Javascript.

0 голосов
/ 16 апреля 2019

django фактически вызывает для каждой связанной модели сигналы pre_delete и post_delete.Поэтому вызов некоторой функции для каждой связанной модели оказался неэффективным.И я думаю, что отсутствие вызова метода delete () приводит к нарушению целостности данных.Например: у нас есть модель myModel с FileField.В случае, когда мы вызываем delete () из некоторого объекта myModel, этот объект и связанный файл будут удалены.Если мы вызовем delete для объекта myModel, этот объект будет удален, но файл останется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...