Django 1.11.17 TypeError:“上下文必须是字典而不是上下文”,除非它是DICT

时间:2018-12-06 17:51:05

标签: python django python-2.7 django-templates django-views

我最近从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

我尝试使用机器人renderrender_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())

3 个答案:

答案 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”,上下文)