Django redirectView返回None

时间:2017-06-16 10:21:18

标签: python django django-class-based-views

我试图在django中使用重定向视图,但我一直收到此错误:

  

视图gp_accountant.gp_taxes.views.TaxRateDeleteView没有返回HttpResponse对象。它改为返回None。

我的代码基于this

任何人都知道问题出在哪里?

这是我的网址文件(路径:get-paid/gp_accountant/gp_taxes/urls.py):

app_name = 'gp_taxes'
urlpatterns = [
    url(r'^$', TaxesListView.as_view(), name='list'),
    url(
        r'^delete_rate/(?P<pk>\d+)/$',
        TaxRateDeleteView.as_view(pattern_name='accountant:gp_taxes:update'),
        name='delete_rate'
    ),
]

TaxRateDeleteView:

class TaxRateDeleteView(RedirectView):
    def dispatch(self, request, *args, **kwargs):
        TaxRate.objects.get(id=int(kwargs['pk'])).delete()

3 个答案:

答案 0 :(得分:3)

@fazilZaid几乎正确,你需要回复他的答案的最后一行。问题是,您的dispatch一般不会返回任何内容,应该返回HttpResponseRedirect,以便在super调用时使用success_url来查看您的视图

class TaxRateDeleteView(RedirectView):
    success_url = # <- your url here

    def dispatch(self, request, *args, **kwargs):
        TaxRate.objects.get(id=int(kwargs['pk'])).delete()
        return super(TaxRateDeleteView,self).dispatch(request, *args, **kwargs)

同样根据@Alasdair的评论

  

使用重定向视图删除对象是个坏主意。你不应该删除带有这样的get请求的对象。

您应该使用https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/#django.views.generic.edit.DeleteView这是删除对象的正确方法,而不是RedirectView

答案 1 :(得分:0)

修改您的观点,

class TaxRateDeleteView(RedirectView):
    def dispatch(self, request, *args, **kwargs):
        TaxRate.objects.get(id=int(kwargs['pk'])).delete()
        return super(TaxRateDeleteView,self).dispatch(request, *args, **kwargs)

在您的视图的调度方法上调用super。

答案 2 :(得分:0)

您不应该重写调度方法。

尝试这样的事情:

class TaxRateDeleteView(RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        TaxRate.objects.get(id=int(kwargs['pk'])).delete()   
        return reverse('delete_rate')