删除对象而不刷新Django

时间:2019-04-16 12:00:57

标签: python django

我正在尝试删除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 个答案:

答案 0 :(得分:2)

您正在删除对象,丢失的是将请求发送给Django之后,如果请求成功,则需要相应地更新HTML。

请求视图时,将呈现页面的HTML。此时,模板中的for循环将执行并遍历所有现有联系人

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

然后,当用户单击删除按钮时,将通过AJAX向Django发送请求,该请求将有效删除所选对象,但HTML代码不会自动更新。 刷新页面时,Django再次执行模板代码,因此再次运行for循环,但是这次联系人列表已更改,这就是您在这种情况下看到更改的原因。

您可以通过多种方式解决问题:

1)而不是通过AJAX调用Django视图,而是制作一个适当的HTML + Django表单,该表单将发布到Django视图中,该表单在处理表单后会再次重定向到同一视图。这将不需要Javascript或AJAX。您可以read more about forms here。这样,您的模板会在每次发布后重新呈现,因此您将看到表已更新。

2)可能最差的选择,也是目前最容易实现的选择,是在AJAX请求成功返回后通过Javascript刷新页面。为此,您可以将函数绑定到success调用的$.ajax属性,该属性触发刷新,例如location.reload();。请注意,这不是一个好选择,因为您正在尽一切努力使用AJAX调用删除视图,但是您并没有获得它的任何好处,仅使两者兼有。

3)第三个选项是在AJAX调用成功返回时使用javascript编辑HTML(实际上是您的DOM)。如果您选择遵循这条路径(我想这是您的意图),但不知道如何执行,建议您提出另一个问题,特别是关于如何通过Javascript更改呈现的HTML。

答案 1 :(得分:0)

django实际上调用了每个相关模型的pre_delete和post_delete信号。因此,发现为每个相关模型调用某些函数并非没有效率。 而且我认为,不调用delete()方法会破坏数据的完整性。 例如:我们有带有FileField的模型myModel。以防万一,当我们从myModel的某些对象调用delete()时,该对象和相关文件将被删除。 如果我们调用与myModel的对象相关的delete,则该对象将被删除,但文件将保留。