我正在使用 Django,我希望我的用户确认他们确实想要删除某些内容。我正在考虑纯 Django 解决方案(没有 Javascript 确认)。根据我的想法,我可以创建一个包含“是”和“否”按钮的新页面。如果用户按“是”,我的网站将继续并从数据库中删除该对象。在不使用 Javascript 的情况下进行删除是正确的方法吗?如果你是我,你会如何实现这个功能?
2 回答
我会使用 Django 的内置DeleteView
,它将显示一个 HTTP 请求的确认页面并为一个 HTTPGET
请求执行删除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
其中解释了如何自定义视图查找要删除的对象的方式(默认是查找名为 的 URL 关键字参数pk
),以及TemplateResponseMixin
解释如何自定义使用的模板的文档(默认为'myapp/author_check_delete.html'
)。
这只是许多基于类的通用视图之一,它们使基本操作(显示单个模型实例的页面、模型实例列表以及处理编辑、删除等)非常快速且易于实现。
如果您以后想用 JavaScript 增强这一点,您总是可以编写一些不显眼的 JS 来检测到删除确认页面的链接(通过查找类或特定 URL)并添加一个单击处理程序,该处理程序会弹出一个确认对话框,然后发送对链接属性中的 URL的POST
请求。href
您还需要稍微修改视图以在request.is_ajax()
is时返回 JSON 对象True
,以便您的 JS 知道删除是成功还是失败,这可能涉及覆盖从DeletionMixin
.
听起来不错。我做过几次是创建一个可以在应用程序的任何地方使用的确认模板:
{% 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
) - 您所在页面的 url (
prev_link
) - 应调用以执行操作的 url (
action_link
)
如果用户取消该操作,那么她/他将返回到原始页面。
如果用户确认,则prev_link
作为隐藏参数传递,因此视图可以在执行操作后将用户重定向到原始页面(尽管这当然是完全可选的)。
这几乎就是您在问题中提出的。