【问题标题】:BaseDeleteView throws AttributeError (render_to_response missing)BaseDeleteView 抛出 AttributeError(render_to_response 缺失)
【发布时间】:2011-10-05 16:36:16
【问题描述】:

我尝试为充当 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。有什么想法吗?

【问题讨论】:

    标签: django django-views


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您从BaseDeleteView 继承,正如the documentation 所述,不包括TemplateResponseMixin - 即与呈现响应有关的所有位。

      改为从DeleteView 继承。

      【讨论】:

      • 但如果我从DeleteView 继承,我必须在单独的页面中确认删除。我真的不想要这个。我想要的是向 URI 发送 GET 请求并执行删除。然后我重定向到不同的 URI。
      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 2020-09-28
      • 2014-07-05
      • 2010-12-29
      • 2012-08-05
      • 1970-01-01
      • 2014-11-01
      • 2013-04-06
      相关资源
      最近更新 更多