如何解决Django中‘loader is not defined’报错问题?
解决Django中"loader未定义"及模板渲染报错问题
问题根源
你遇到的NameError: name 'loader' is not defined是因为导入方式和调用方式不匹配:
- 你写了
from django.template.loader import get_template,这是直接导入了get_template函数,而非loader模块,所以不能用loader.get_template()来调用。 - 代码里还有两个拼写错误,会导致后续渲染失败:
template.rendar()→ 正确写法是template.render()- context里的
lastest_question_list→ 变量名是latest_question_list,键名多了个s,模板引用时会找不到对应数据
两种修正方案
方案1:直接使用已导入的get_template函数
修改index视图函数,直接调用get_template,同时修正拼写错误:
from imp import load_source from django.shortcuts import render from django.http import HttpResponse from .models import Question from django.template.loader import get_template from django.template import Template def index(request): latest_question_list = Question.objects.order_by("pub_date")[:5] # 直接调用get_template,无需loader前缀 template = get_template("polls/index.html") context = { # 修正键名拼写 "latest_question_list": latest_question_list, } # 修正render拼写 return HttpResponse(template.render(context, request))
方案2:导入loader模块
如果想保留loader.get_template()的写法,把导入语句改成导入loader模块:
from imp import load_source from django.shortcuts import render from django.http import HttpResponse from .models import Question # 改为导入loader模块 from django.template import loader from django.template import Template def index(request): latest_question_list = Question.objects.order_by("pub_date")[:5] template = loader.get_template("polls/index.html") context = { "latest_question_list": latest_question_list, } return HttpResponse(template.render(context, request))
额外简化方案
Django推荐用你已导入的render函数简化模板渲染,一行代码即可完成加载与渲染:
def index(request): latest_question_list = Question.objects.order_by("pub_date")[:5] context = {"latest_question_list": latest_question_list} # 自动处理模板加载和渲染 return render(request, "polls/index.html", context)
内容的提问来源于stack exchange,提问作者Sam McGraw
相关产品推荐
相关产品推荐

