这是获取3个对象并使用Ajax返回模板的视图
def getText(request):
l=request.POST.get('lid','')
n=request.POST.get('cid','')
o=request.POST.get('pid','')
# print(l)
try:
lb=books.objects.get(id=l)
con=contacts.objects.get(id=n)
mo=movies.objects.get(id=o)
except books.DoesNotExist:
lb=None
except contacts.DoesNotExist:
con=None
except movies.DoesNotExist:
mo=None
serialized_obj = serializers.serialize('json', [ lb,con,mo ])
return HttpResponse(serialized_obj,content_type='application/json')
我收到以下错误 UnboundLocalError:分配前引用了本地变量'mo'
答案 0 :(得分:1)
您没有与id = n的联系人。 所以异常被抛出了
except contacts.DoesNotExist:
con=None
con被分配为无
因此mo=movies.objects.get(id=o)
未执行。
serialized_obj = serializers.serialize('json', [ lb,con,mo ])
接下来执行,因此在分配之前先引用了
答案 1 :(得分:1)
在try
块中引发异常时,将执行第一个匹配的处理程序(except
块),然后,执行将跳转到整个{{1}之后的第一个语句} (nb:当然有一个匹配的处理程序)。因此,在您的情况下:
try/except
如果try块中的第一条语句引发了try:
lb=books.objects.get(id=l)
con=contacts.objects.get(id=n)
mo=movies.objects.get(id=o)
except books.DoesNotExist:
lb=None
except contacts.DoesNotExist:
con=None
except movies.DoesNotExist:
mo=None
serialized_obj = serializers.serialize('json', [ lb,con,mo ])
,则执行流跳至第一个Book.DoesNotExist
子句(它将except
设置为lb
,__然后跳转到None
语句。此时,serialized_obj = serializers.serialize('json', [ lb,con,mo ])
和con
都没有定义,因此会出错。
这里有两种可能的解决方案:第一种是每个语句使用一个mo
,即:
try/except
这是一个好习惯(非常明确,每个try块中都包含了尽可能少的代码,等等),但是有点冗长。在您的情况下,另一种(更简单的)解决方案是先将所有三个名称定义为try:
lb=books.objects.get(id=l)
except books.DoesNotExist:
lb=None
try:
con=contacts.objects.get(id=n)
except contacts.DoesNotExist:
con=None
try:
mo=movies.objects.get(id=o)
except movies.DoesNotExist:
mo=None
,然后使用空的None
子句进行try / except,即:
except
答案 2 :(得分:0)
在此代码中,如果不存在书籍或联系人,则转到相应的例外并将其设置为None
,但mo
仍未定义。