0

我目前正在尝试覆盖DeleteView的继承delete方法来实现我想要的行为。但是,我对 Django 框架和 Python 比较陌生,不知道该怎么做。
目标是删除一个对象,如果ProtectedError发生,confirm_delete模板应显示描述问题的错误消息,并且不应将用户重定向到success_url. 我的第一种方法,类似于其他形式,是将错误打包到form.non_field_error中,但我不知道如何访问它。

def delete(self, request, *args, **kwargs):
    self.object = self.get_object()
    success_url = self.get_success_url()
    try:
        self.object.delete()
        # Redirect to success_url
    except ProtectedError:
        pass
        # Add error to confirm_delete template / delete Form and stay on the delete confirmation page (don't delete)
    return HttpResponseRedirect(success_url)

那么,用户怎么可能只在成功删除后才被重定向到success_url,但如果出现ProtectedError,并且没有发生重定向,confirm_delete 模板上会出现错误消息?

4

1 回答 1

1

你基本上做与get()类的方法相同的事情,只是将一些关于错误的信息添加到上下文中。

def delete(self, request, *args, **kwargs):
    self.object = self.get_object()
    success_url = self.get_success_url()
    try:
        self.object.delete()
        # Redirect to success_url
    except ProtectedError:
        context = self.get_context_data(
            object=self.object,
            error='Object is protected'
        )
        return self.render_to_response(context)
    return HttpResponseRedirect(success_url)

查看https://ccbv.co.uk以更好地了解基于 Django 类的视图如何在幕后工作。

然后,您必须在模板中显示错误。这是 Django 文档中的模板示例:

<form method="post">{% csrf_token %}
    {% if error }}<p class="error">{{ error }}</p>{% endif %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm">
</form>
于 2019-01-15T09:38:31.913 回答