Django:TypeError:context必须是dict而不是str

时间:2017-06-26 22:06:28

标签: python django python-2.7 python-3.x django-views

如果GroupMember的对象不存在但是显示此错误,我想重定向到网址:

TypeError:context必须是dict而不是str。

以下是我的观点:

class GroupDetail(DetailView):

template_name = "group_detail.html"
model = Group

def get_context_data(self, **kwargs):
    context = super(GroupDetail, self).get_context_data(**kwargs)
    # Code
    try:
        group_member = GroupMember.objects.get(member=volunteer, group=group)
        context['group_member'] = group_member
        # Code
        return context
    except:
        return reverse('users:home')

我尝试使用redirect和reverse_lazy,但显示相同的错误,我尝试使用

reverse('users:home', {}), reverse('users:home', kwargs={}) 

reverse('users:home', kwargs=None)

3 个答案:

答案 0 :(得分:2)

首先,这总是出错,因为本地数据中没有成员或志愿者。

其次,正确的方法是返回None或空dict并覆盖3

render_to_response

这样,您可以充分利用API,并可以扩展和覆盖您需要的位,这就是设计基于类的视图的原因。

答案 1 :(得分:0)

get_context_data()方法必须返回表示模板上下文的字典,而不是URL字符串。要重定向异常,您可以改为覆盖get()方法:

from django.http HttpResponseRedirect

class GroupDetail(DetailView):
    template_name = "group_detail.html"
    model = Group

    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        try:                
            # your code            
            return self.render_to_response(context)
        except:
            return HttpResponseRedirect(reverse("users:home"))

您可以查看DetailView及其祖先here的源代码。

答案 2 :(得分:0)

如果您的代码抛出异常,它将运行return reverse('users:home'),从而产生str数据类型。

然而,Django docs明确指出:

  

get_context_data(**kwargs)

     

返回表示模板上下文的字典。

您需要做类似的事情:

def get_context_data(self, **kwargs):
  context = super(GroupDetail, self).get_context_data(**kwargs)
  # Code
  try:
      group_member = GroupMember.objects.get(member=volunteer,group=group)
      context['group_member'] = group_member
      # Code
  finally:
      return context

或者如果你想重定向,你可以这样做:

def get_context_data(self, **kwargs):
  context = super(GroupDetail, self).get_context_data(**kwargs)
  # Code
  try:
      group_member = GroupMember.objects.get(member=volunteer,group=group)
      context['group_member'] = group_member
      # Code
  except:
      return HttpResponseRedirect(reverse('users:home'))