【问题标题】:Django 'str' object has no attribute 'get'Django 'str' 对象没有属性 'get'
【发布时间】:2018-06-06 23:56:22
【问题描述】:

我正在尝试在完成表单后将用户重定向到另一个页面而不保存。但是,当我使用反向功能时,我得到一个错误:'str' object has no attribute 'get'

在下面基于类的视图中,self.object.thing_id 打印它应该打印的数据。

基于类的视图:

class ThingUpdateView(LoginRequiredMixin, UpdateView):
    def form_valid(self, form):
        if self.object.status != 'initiated':
            print(self.object.thing_id)
            return reverse('thing:detail', kwargs={'thing_id': str(self.object.thing_id) })
        return super().form_valid(form)

即使 reverse('thing:list') 也会出现同样的错误

App Things 的 urls.py

url(r'^$', ThingListView.as_view(), name='list'),
url(r'^(?P<thing_id>[0-9A-Za-z]+)/$', ThingDetailView.as_view(), name='detail'),
url(r'^update/(?P<thing_id>[0-9A-Za-z]+)/$', ThingUpdateView.as_view(), name='update'),

当用户点击 html 页面上的提交按钮时会发生此错误。它启动表单,然后路由到 form_valid 部分。 self.objectstatus != 'initiated' 因此它会尝试返回相反的结果。

这是堆栈跟踪:

Traceback:

File "C:\Users\Starlord\Dev\ecommerce\lib\site-packages\django\core\handlers\exception.py" in inner
  41.             response = get_response(request)

File "C:\Users\Starlord\Dev\ecommerce\lib\site-packages\django\utils\deprecation.py" in __call__
  142.             response = self.process_response(request, response)

File "C:\Users\Starlord\Dev\ecommerce\lib\site-packages\django\middleware\clickjacking.py" in process_response
  32.         if response.get('X-Frame-Options') is not None:

Exception Type: AttributeError at /things/update/vd2dqvw3nw/
Exception Value: 'str' object has no attribute 'get'

【问题讨论】:

  • 如果您需要这方面的帮助,您需要更多详细信息,例如发生错误的代码行。
  • 更好吗?堆栈跟踪不是很有帮助。执行反向时调用错误
  • reverse() 返回一个字符串。 form_valid() 应该返回 HTTP 响应,而不是字符串。

标签: django django-urls


【解决方案1】:

改用HttpResponseRedirect

from django.http import HttpResponseRedirect

return HttpResponseRedirect(reverse('thing:detail', kwargs={'thing_id':self.object.thing_id}))

【讨论】:

  • 我说你少了一些括号,不是吗?
  • @mrpepo877 请注意,这是 3 年前回答的。如果我应该更新它,请告诉我。
  • 在我看来应该是HttpResponseRedirect(reverse('thing:detail', kwargs={'thing_id':self.object.thing_id}))
  • @mrpepo877 是的,你是对的,我错过了一些括号。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2014-04-28
  • 2020-12-11
  • 1970-01-01
  • 2014-05-12
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多