我正在使用Django,我希望我的用户确认他们确实想要删除某些内容。我正在考虑纯Django解决方案(没有Javascript确认)。 根据我的想法,我可以创建一个包含“是”和“否”按钮的新页面。如果用户按“是”,我的站点将继续并从数据库中删除该对象。 这是不使用Javascript进行删除的正确方法吗?如果你是我,你会如何实现这个功能?
答案 0 :(得分:5)
我会使用内置DeleteView
的Django,它会显示HTTP GET
请求的确认页面并执行HTTP POST
请求的删除。
文档给出了这个例子:
from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author
class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('author-list')
我建议阅读SingleObjectMixin
的文档,该文档解释了如何自定义视图查找要删除的对象的方式(默认是查找名为pk
的URL关键字参数),以及TemplateResponseMixin
解释了如何自定义所使用的模板(默认为'myapp/author_check_delete.html'
)。
这只是许多class-based generic views中的一个,它们可以非常快速,轻松地进行基本操作(显示单个模型实例的页面,模型实例列表以及处理编辑,删除等)。实施
如果您希望稍后使用JavaScript增强此功能,您可以随时编写一些不显眼的JS来检测删除确认页面的链接(通过查找类或特定的URL)并添加一个弹出确认对话框的单击处理程序然后在链接的POST
属性中向URL发送href
请求。当request.is_ajax()
为True
时,您还需要稍微修改视图以返回JSON对象,以便您的JS知道删除是成功还是失败,这可能涉及覆盖其中一个方法继承自DeletionMixin
。
答案 1 :(得分:4)
听起来不错。我做了几次是创建一个可以在应用程序的任何地方使用的确认模板:
{% extends 'base.html' %}
{% block content %}
<div class="confirmation-box">
<p>{{ message }}</p>
<div>
<a href="{{ prev_link }}">Cancel</a>
<form action="{{ action_link }}" method="post">
<input type="hidden" name="next" value="{{ prev_link }}" />
<input type="submit" value="Send" />
</form>
</div>
</div>
{% endblock %}
你传递给它:
message
)prev_link
)action_link
)如果用户取消操作,则她/他返回原始页面。
如果用户确认,则prev_link
作为隐藏参数传递,因此视图可以在执行操作后将用户重定向到原始页面(尽管这当然是完全可选的)。
这几乎就是你在问题中提出的问题。