我最近从Django 1.9切换到1.11.17,有一件事困扰着我很多。出现
错误TypeError at /somepath
context must be a dict rather than Context
抛出该行的行是:
return render(request=request, template_name="mytemplate.html", context={"form": form, "update": updateType})
在SO上有很多答案,人们可以使用RequestContext或Context代替context
的dict,而切换到dict可以解决他们的问题。但是不适合我。在这里,我可以肯定我的context
实际上是一个字典。如果将其更改为:
return render(request=request, template_name="mytemplate.html", context={})
该错误消失了,但显然稍后会导致另一个错误。你们对我在这里做错什么有任何想法吗?
编辑: 我的进口货:
from django.shortcuts import render, render_to_response
from django.template.context import RequestContext, Context
我尝试使用机器人render
和render_to_response
来达到类似效果。同样使用Context或RequestContext也会出现类似的错误。
EDIT2:更多代码供参考
from django.http import (
HttpResponseRedirect,
HttpResponseBadRequest,
)
from django.shortcuts import render, render_to_response
from django.template import RequestContext, Context
from django.utils.html import escape
# some more imports, but from local files, not django
def update_my_template(request):
user = request.user
# preform some checks for user
...
if request.method == "GET":
updateType = request.GET.get("id")
if updateType:
form = None
if updateType == "something":
form = SomeForm(user)
if updateType == "something else":
form = DifferentForm()
if form is None:
return HttpResponseRedirect("/somepage")
# This was the code that worked in 1.9
rctx = RequestContext(
request, {"form": form, "update": updateType}
)
return render_to_response("mytemplate.html", rctx)
# some different cases, but the error is thrown already
...
这些都不起作用:
dictctx = {"form": form, "update": updateType}
return render(request=request, template_name="mytemplate.html", dictctx)
。
ctx = Context({"form": form, "update": updateType})
return render(request=request, template_name="mytemplate.html", ctx)
。
ctx = Context({"form": form, "update": updateType})
return render(request=request, template_name="mytemplate.html", ctx.flatten())
。
rctx = RequestContext(request, {"form": form, "update": updateType})
return render_to_response("mytemplate.html", rctx.flatten())
答案 0 :(得分:1)
render
的逻辑是不同的,具体取决于您传递给render
的内容:
def render(self, context):
"Display stage -- can be called many times"
with context.render_context.push_state(self):
if context.template is None:
with context.bind_template(self):
context.template_name = self.name
return self._render(context)
else:
return self._render(context)
,看起来您似乎可以将参数template_name
更改为name
,但是您的对象没有context.render_context
值,这就是为什么会更好的原因创建和使用Context
https://docs.djangoproject.com/en/1.11/_modules/django/template/base/#Template.render
文档显示传递Context
的实际实例,因此我建议您在代码中执行此操作,而不是仅传递dict:
>>> from django.template import Context, Template
>>> template = Template("My name is {{ my_name }}.")
>>> context = Context({"my_name": "Adrian"})
>>> template.render(context)
"My name is Adrian."
>>> context = Context({"my_name": "Dolores"})
>>> template.render(context)
因此修复代码的最简单方法是:
from django.template import Context
...
return render(request=request, template_name="mytemplate.html", context=Context({"form": form, "update": updateType}))
答案 1 :(得分:1)
好吧,经过进一步的挖掘(在“未解决的”问题中),我发现了this gem。是的,那是解决我的问题的方法。基本上,我的{{form|bootstrap}}
中有行mytemplate.html
,这是造成此问题的原因。
更好的是,将django-bootstrap-form
更新为3.4版,使我可以保留{{form|bootstrap}}
并摆脱错误。
答案 2 :(得分:-1)
始终在参数中传递变量/值。但是你们要同时给两个。试试这个,...
返回渲染(request = request,template_name =“ mytemplate.html”, {“ form”:表单,“ update”:updateType})
或
context = {“ form”:表单,“ update”:updateType}返回 渲染(request = request,template_name =“ mytemplate.html”,上下文)