Django redirectView returns None
Django redirectView returns None
我正在尝试在 Django 中使用重定向视图,但我一直收到此错误:
The view gp_accountant.gp_taxes.views.TaxRateDeleteView didn't return an HttpResponse object. It returned None instead.
我的代码基于 this question。
谁知道问题出在哪里?
这是我的 url 文件(路径: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()
编辑您的观点,
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。
@FazilZaid 几乎正确,您需要 return 他回答的最后一行。问题是你的 dispatch
没有 return 一般它应该 return 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 的评论
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
您不应该重写调度方法。
试试这样的方法:
class TaxRateDeleteView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
TaxRate.objects.get(id=int(kwargs['pk'])).delete()
return reverse('delete_rate')
我正在尝试在 Django 中使用重定向视图,但我一直收到此错误:
The view gp_accountant.gp_taxes.views.TaxRateDeleteView didn't return an HttpResponse object. It returned None instead.
我的代码基于 this question。
谁知道问题出在哪里?
这是我的 url 文件(路径: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()
编辑您的观点,
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。
@FazilZaid 几乎正确,您需要 return 他回答的最后一行。问题是你的 dispatch
没有 return 一般它应该 return 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 的评论
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
您不应该重写调度方法。
试试这样的方法:
class TaxRateDeleteView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
TaxRate.objects.get(id=int(kwargs['pk'])).delete()
return reverse('delete_rate')