gpt4 book ai didi

python - Django 1.11.17 TypeError : 'context must be a dict rather than Context' , 除了它是一个字典

转载 作者:行者123 更新时间:2023-12-01 08:37:16 27 4
gpt4 key购买 nike

我最近从 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 而不是 dict 作为 context 并切换到 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

我尝试过 bot 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())

最佳答案

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 的实际实例,因此我建议您在代码中执行此操作,而不仅仅是传递字典:

>>> 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}))

关于python - Django 1.11.17 TypeError : 'context must be a dict rather than Context' , 除了它是一个字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53657092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com