BaseDeleteView抛出AttributeError(缺少render_to_response)

时间:2011-10-05 16:36:16

标签: django django-views

我尝试为一个充当REST后端前端的网站实现基于BaseDeleteView的视图。双方通过HTTP请求进行通信。我想要实现的是我向激活URI发送GET请求(注册后发送每封电子邮件)。在此视图中,我首先向后端发送HTTP请求,然后从前端的数据库中删除激活对象。我不想要一个确认页面,因此DeleteView是不可能的。

class ActivationView(BaseDeleteView):
    success_url = "/activation/success/"

    def get_object(self, queryset=None):
        uuid = self.kwargs['uuid']
        try:
            obj = AccountRegistration.objects.get(uuid=uuid)
        except ObjectDoesNotExist:
            raise Http404('Registration not found.')

        return obj

    def delete(self, request, *args, **kwargs):
        obj = self.get_obj()

        if obj.expire_date < datetime.now():
            obj.delete()
            raise Http404('Registration expired.')

        # send a http request to the backend
        t = Transaction('/activate/%s/' % obj.account_name)
        t.emit()

        # delete the object
        obj.delete()

        # and redirect the request
        return HttpResponseRedirect(self.get_success_url())

我的urls.py看起来像这样:

url(r'^activate/(?P<uuid>\w+)/$',
    ActivationView.as_view(), name="account-activate"),

但是我收到以下错误:

Traceback (most recent call last):
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 68, in __call__
    return self.application(environ, start_response)
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 272, in __call__
response = self.get_response(request)
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/core/handlers/base.py", line 169, in get_response
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/core/handlers/base.py", line 203, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/views/generic/base.py", line 47, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/crito/.pythonbrew/venvs/Python-2.7.2/thirty-web/lib/python2.7/site-packages/django/views/generic/detail.py", line 100, in get
    return self.render_to_response(context)
AttributeError: 'ActivationView' object has no attribute 'render_to_response'

在我看来,它甚至不应该调用render_to_response。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果您想省略确认页面,只需使用POST直接调用DeleteView即可。这是最理想的,因为对象的删除应该受到csrf的保护。

答案 1 :(得分:0)

您继承自BaseDeleteView,其中the documentation个状态不包含TemplateResponseMixin - 即与呈现响应有关的所有位。

继承DeleteView