【问题标题】:How to send error message to the Django generic DeleteView Confirmation Page using JsonResponse如何使用 JsonResponse 将错误消息发送到 Django 通用 DeleteView 确认页面
【发布时间】:2023-03-30 21:05:01
【问题描述】:

我正在尝试通过 确认页面 使用 Django 通用 DeleteView。设置按预期工作。

后来更改了业务逻辑以防止删除,如果有分配给要删除的对象的子实例,在模型中使用on_delete=models.PROTECT。

并且DeleteView已修改为以下内容:

class TerritoryDeleteView(LoginRequiredMixin, DeleteView):
    template_name = ".../trty_delete.html"
    model = Territory
    success_url = reverse_lazy('territories_list')

    # THE FOLLOWING MODIFICATION DONE:
    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        try:
            self.object.delete()
            return HttpResponseRedirect(success_url)
        except ProtectedError:
            error_message = "This object can't be deleted, as an Outlet is already assigned to the Territory..."
            return JsonResponse(error_message, safe=False)

上述(修改后的)视图工作正常。但是,如果遇到ProtectedError,error_message 会显示在空白浏览器页面中。

如何在确认页面(模板)本身中显示error_message?

【问题讨论】:

  • 你应该使用render()函数
  • @ArakkalAbu - 谢谢。现在可以看到消息了。但是,object details(正在删除的对象的)现在从页面中丢失了。 例如,如果对象位于曼哈顿下城,则在首先执行Delete 选项时,其详细信息可用(这样做是为了便于用户理解)。现在,当应用程序遇到ProtectedError 时,这些细节就完全消失了。可能是因为在异常情况下,上下文没有像正常情况下那样被传输(即在没有错误的情况下)。我应该怎么做才能始终将上下文数据保留在页面上?

标签: django error-handling django-views jsonresponse


【解决方案1】:

首先,更改您的 delete(...) 方法以捕获 ProtectedError 错误(您已经完成),然后 传递错误消息作为模板的上下文数据作为

class TerritoryDeleteView(LoginRequiredMixin, DeleteView):
    template_name = ".../trty_delete.html"
    model = Territory
    success_url = reverse_lazy('territories_list')

    def delete(self, request, *args, **kwargs):
        try:
            return super().delete(request, *args, **kwargs)
        except ProtectedError:
            self.object = self.get_object()
            context = self.get_context_data(
                object=self.object,
                error="Any error msg"
            )
            return self.render_to_response(context)

但是,这还不够,我们还要更新模板文件。

<form method="post">{% csrf_token %}
    {% if error %}
        {{ error }}
    {% else %}
        <p>Are you sure you want to delete "{{ object }}"?</p>
        <input type="submit" value="Confirm">
    {% endif %}

</form>

注意: 这可能不适合您的情况完全,但是,这可能会让您了解如何很好地管理错误消息。

【讨论】:

  • 我已经处理了错误消息的条件显示。我非常缺少的部分是正在删除的对象的详细信息。感谢您的回答。拯救了我的一天!
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多