我正在尝试删除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>
它工作正常,但可以刷新页面。如何删除所选对象 单击删除按钮后, 有什么帮助吗? 谢谢!
答案 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,则该对象将被删除,但文件将保留。