首页 > 解决方案 > 重定向到特定的 url 而不是 Django 中的 404

问题描述

而不是在下面的代码中做一个 raise Http404,我想将用户发送到一个特定的 URL('/risking/notyours/')。我曾尝试使用HttpResponseRedirectand reverse,但似乎无法正常工作。

建议?

代码:

class ProspectDelete(LoginRequiredMixin, DeleteView):
    login_url = '/accounts/login/'
    model = Prospect
    template_name = 'risking/prospect_delete.html'
    success_url = reverse_lazy('index')

    def get_object(self, queryset=None):
        """ Hook to ensure object is owned by request.user. """
        obj = super(ProspectDelete, self).get_object()
        if not obj.owner == self.request.user:
            raise Http404 ###This is what I need to change###
        return obj

标签: djangodjango-templates

解决方案


get_object方法应该返回一个模型实例。您不能从那里返回重定向响应。

一种选择是引发自定义异常并在dispatch方法中捕获它。

from django.shortcuts import redirect

class WrongOwner(Exception):
    pass

class ProspectDelete(LoginRequiredMixin, DeleteView):
    ...   

    def dispatch(self, request, *args, **kwargs):
        try:
            return super(ProspectDelete, self).dispatch(request, *args, **kwargs)
        except WrongOwner:
            return redirect('/risking/notyours/')

    def get_object(self, queryset=None):
        """ Hook to ensure object is owned by request.user. """
        obj = super(ProspectDelete, self).get_object()
        if not obj.owner == self.request.user:
            raise WrongOwner
        return obj

推荐阅读