【问题标题】:ValueError - didn't return an HttpResponse object. - In Delete View DjangoValueError - 没有返回 HttpResponse 对象。 - 在删除视图中 Django
【发布时间】:2019-08-03 23:26:57
【问题描述】:

我在删除用户时收到ValueError

错误 -

/employee/delete/31/ 处的 ValueError

视图 apps.employee.views.EmployeeDeleteView 没有返回 HttpResponse 目的。它返回 None 。

class EmployeeDeleteView(LoginRequiredMixin, generic.DeleteView):
    model = User
    template_name = 'employee/employee_confirm_delete.html'
    context_object_name='employees'

    def get(self, request, *args, **kwargs):
        # Tab Opts Checking
        if request.user.userprofile.user_company.company_tab_opts:
            return redirect('admin_employee')

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.userprofile.soft_delete()
        messages.success(request, 'Employee Deleted Successfully.')
        return HttpResponseRedirect(reverse('admin_employee'))

这是错误的回溯

Internal Server Error: /employee/delete/31/
Traceback (most recent call last):
  File "/home/.virtualenvs/apollo_django-njoxc1BQ/lib/python3.5/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/.virtualenvs/apollo_django-njoxc1BQ/lib/python3.5/site-packages/django/core/handlers/base.py", line 137, in _get_response
    "returned None instead." % (callback.__module__, view_name)
ValueError: The view apps.employee.views.EmployeeDeleteView didn't return an HttpResponse object. It returned None instead.

【问题讨论】:

  • 似乎在您的 get 方法中,您在 if 条件之后返回 redirect。但是如果你的if 返回False 你的get 方法返回None
  • 如果你在get方法中的IF条件为假,你需要返回一些东西
  • 哦,我明白了。我删除了get 方法并将if 条件放入delete 方法中。然后它工作了。感谢您的评论。但我不知道这是正确的方法

标签: django django-models django-forms django-templates django-views


【解决方案1】:

这就是我所做的。但不知道是不是正确的做法

class EmployeeDeleteView(LoginRequiredMixin, generic.DeleteView):
    model = User
    template_name = 'employee/employee_confirm_delete.html'
    context_object_name='employees'


    def delete(self, request, *args, **kwargs):
        # Tab Opts Checking
        if request.user.userprofile.user_company.company_tab_opts:
            return redirect('admin_employee')
        self.object = self.get_object()
        self.object.userprofile.soft_delete()
        messages.success(request, 'Employee Deleted Successfully.')
        return HttpResponseRedirect(reverse('admin_employee'))

【讨论】:

  • 这取决于您的要求。 get 用于第一次显示表单(通常显示要删除的对象并要求用户确认),delete 在用户提交表单时调用(通常在单击确认按钮后,如'yes , 我确定')。所以在这里,用户说“是的,我确定”,但在某种情况下,您实际上并没有删除,而是将用户重定向到另一个页面。如果这就是业务需求,那么您的代码就可以了。
猜你喜欢
  • 2021-09-01
  • 2011-03-06
  • 2017-03-28
  • 1970-01-01
  • 2020-08-09
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多