2017-06-16 44 views
0

我想用在Django重定向的观点,但我不断收到此错误:Django的RedirectView的返回无

The view gp_accountant.gp_taxes.views.TaxRateDeleteView didn't return an HttpResponse object. It returned None instead.

我基于this question我的代码。

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

这是我的网址文件(路径:​​):

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

**使用删除对象重定向视图是一个坏主意**。您不应该通过像这样获取请求来删除对象。 ['DeleteView'](https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/#deleteview)将是一个更好的开始。 – Alasdair

+0

感谢您的通知。我已经提出了回答这个问题。 – gonczor

回答

3

@FazilZaid几乎正确,你需要返回他答案的最后一行。问题是,你的dispatch不返回任何东西一般它应该返回HttpResponseRedirect所以,使其工作与super叫你需要@Alasdair

提供 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) 

而且按照此评论

Using a redirect view for deleting objects is a bad idea. You should not be deleting objects with get requests like this.

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

+0

我的不好,没有注意到....谢谢你提醒虽然 – zaidfazil

+0

工作就像一个魅力。 +1提一个更好的方式来执行删除。 – gonczor

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) 

调用超你视图。

0

你不应该重写调度实现方法具d。

尝试这样代替:

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

我不认为把逻辑放入'get_redirect_url'是正确的方法。总的来说,我期望它只给我的网址不删除任何东西。 – gonczor

+0

为什么在调度方法中更好?这种方式只有在其他所有内容对于重定向视图都正确的情况下才会发生。 –

+0

好吧,公平地说,RedirectView上有一个删除方法,它将是放置它的最佳位置,尽管您需要确保它是发送到视图的删除请求。我不认为派发是删除对象的最佳场所。 –