Python >> Python opplæring >  >> Python

Django 1.11 TypeError-kontekst må være en dict i stedet for Context

I Django 1.8+ er malens render metoden tar en ordbok for context parameter. Støtte for å sende en Context forekomsten er utdatert, og gir en feil i Django 1.10+.

I ditt tilfelle bruker du bare en vanlig dict i stedet for en Context forekomst:

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

Du foretrekker kanskje å bruke render_to_string snarvei:

from django.template.loader import render_to_string

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

Hvis du brukte RequestContext i stedet for Context , så passerer du request til disse metodene også slik at kontekstprosessorene kjører.

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)

Migrert fra Django 1.8 til Django 1.11.6

Uansett hvor jeg hadde en RequestContext-klasse, er det en metode flatten() som returnerer resultatet som en dict.

Så hvis klassen er RequestContext...

return t.render(context)

blir

return t.render(context.flatten())

Og i et tilfelle hvor konteksten er pakket inn av Context(), bare fjern den. Fordi Context() er utdatert.

return t.render(Context(ctx))

blir

return t.render(ctx)

For django 1.11 og senere må konteksten være dict.

Du kan bruke:

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

eller

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