錯誤描述html
TypeError at /time/ context must be a dict rather than Context. Request Method: GET Request URL: http://127.0.0.1:8000/time/ Django Version: 2.0.5 Exception Type: TypeError Exception Value: context must be a dict rather than Context. Exception Location: E:\Python\djone\venv\lib\site-packages\django\template\context.py in make_context, line 274 Python Executable: E:\Python\djone\venv\Scripts\python.exe Python Version: 3.6.5 Python Path: ['E:\\Python\\djone\\mysite', 'E:\\Python\\djone\\venv\\Scripts\\python36.zip', 'C:\\Users\\daixiyu\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\daixiyu\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\daixiyu\\AppData\\Local\\Programs\\Python\\Python36', 'E:\\Python\\djone\\venv', 'E:\\Python\\djone\\venv\\lib\\site-packages', 'E:\\Python\\djone\\venv\\lib\\site-packages\\setuptools-28.8.0-py3.6.egg', 'E:\\Python\\djone\\venv\\lib\\site-packages\\pip-9.0.1-py3.6.egg'] Server time: Fri, 25 May 2018 23:27:35 +0000
代碼python
def current_datetime(request): now = datetime.datetime.now() t = get_template('current_datetime.html') html = t.render(Context({'current_date': now})) return HttpResponse(html)
分析django
問題出在 t.render() 上 在Django2.0.5中ide
get_template()返回的Template對象的render方法上,讓咱們看一下render方法的源碼ui
def render(self, context=None, request=None): context=make_context(context,request,autoescape=self.backend.engine.autoescape) try: return self.template.render(context) except TemplateDoesNotExist as exc: reraise(exc, self.backend)
看第二行,調用了make_context(), 再看 make_context() 的源碼code
def make_context(context, request=None, **kwargs): """ Create a suitable Context from a plain dict and optionally an HttpRequest. """ if context is not None and not isinstance(context, dict): raise TypeError('context must be a dict rather than %s.' % context.__class__.__name__) if request is None: context = Context(context, **kwargs) else: # The following pattern is required to ensure values from # context override those from template context processors. original_context = context context = RequestContext(request, **kwargs) if original_context: context.push(original_context) return context
看到第五行,此時會檢查context是否爲一個字典,目的是在隨後爲了使用context建立一個Context實例htm
結論對象
不要給Template對象的render()方法傳遞Context對象,其會使用傳入的字典,自動建立一個Context對象,以供使用ip