【问题标题】:Django redirectView returns NoneDjango 重定向视图返回无
【发布时间】:2017-11-19 02:09:59
【问题描述】:

我正在尝试在 django 中使用重定向视图,但我不断收到此错误:

视图 gp_accountant.gp_taxes.views.TaxRateDeleteView 未返回 HttpResponse 对象。它返回 None 。

我的代码基于this question

有人知道问题出在哪里吗?

这是我的网址文件(路径: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()

【问题讨论】:

  • 使用重定向视图删除对象是个坏主意。您不应该使用这样的获取请求来删除对象。 DeleteView 将是一个更好的起点。
  • 感谢您的通知。我赞成提到这一点的答案。

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


【解决方案1】:

@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 的评论

使用重定向视图删除对象是个坏主意。您不应该使用这样的获取请求删除对象。

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

【讨论】:

  • 工作就像一个魅力。 +1 提及执行删除的更好方法。
【解决方案2】:

编辑您的视图,

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。

【讨论】:

    【解决方案3】:

    你不应该重写 dispatch 方法。

    试试这样的方法:

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

    【讨论】:

    • 我不认为将逻辑放入get_redirect_url 是正确的方法。总的来说,我希望它只会给我 url 而不会删除任何东西。
    • 为什么dispatch方法更好?这样,只有在重定向视图的其他所有内容都正确时才会发生。
    • 好的,公平地说,RedirectView 上有一个删除方法,这是放置它的最佳位置,但您需要确保它是发送到视图的删除请求.我也不认为 dispatch 是删除对象的最佳场所。
    猜你喜欢
    • 2011-08-30
    • 2015-11-01
    • 1970-01-01
    • 2020-02-11
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多