如果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)
答案 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明确指出:
返回表示模板上下文的字典。
您需要做类似的事情:
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'))