Django 1.11 TypeError上下文必须是dict而不是Context

时间:2017-05-04 15:56:41

标签: python django django-views

刚在我的某个表单上收到了Sentry错误555-555-5555 x1234。我知道它与Django 1.11有关,但我不确定要修改什么来修复它。

违规行

TypeError context must be a dict rather than Context.

整个视图

message = get_template('email_forms/direct_donation_form_email.html').render(Context(ctx))

3 个答案:

答案 0 :(得分:50)

Django 1.8+中,模板的render方法会获取context参数的字典。支持传递Context实例is deprecated,并在Django 1.10 +中出错。

在您的情况下,只需使用常规dict代替Context实例:

message = get_template('email_forms/direct_donation_form_email.html').render(ctx)

您可能更喜欢使用render_to_string快捷方式:

from django.template.loader import render_to_string

message = render_to_string('email_forms/direct_donation_form_email.html', ctx)

如果您使用的是RequestContext而不是Context,那么您也可以将request传递给这些方法,以便上下文处理器运行。

message = get_template('email_forms/direct_donation_form_email.html').render(ctx, request=request)
message = render_to_string('email_forms/direct_donation_form_email.html', ctx, request=request)

答案 1 :(得分:7)

从Django 1.8迁移到Django 1.11.6

无论我有一个RequestContext类,都有一个flatten()方法,可将结果作为字典返回。

因此,如果类是RequestContext。...

Proxy

成为

return t.render(context)

在上下文被Context()包装的情况下,只需将其删除即可。因为不推荐使用Context()。

return t.render(context.flatten())

成为

return t.render(Context(ctx))

答案 2 :(得分:0)

对于Django 1.11及更高版本,上下文必须是dict。 您可以使用:

context_dict = get_context_dict(context)
return t.render(context_dict)

context_dict = context.flatten()
return t.render(context_dict)