python - example - render django
El contexto Django 1.11 TypeError debe ser un dict en lugar de un contexto (1)
Acaba de recibir el error de error de Sentry El TypeError context must be a dict rather than Context.
en uno de mis formularios. Sé que tiene algo que ver con Django 1.11, pero no estoy seguro de qué cambiar para solucionarlo.
Línea ofensiva
message = get_template(''email_forms/direct_donation_form_email.html'').render(Context(ctx))
Vista completa
def donation_application(request):
if request.method == ''POST'':
form = DirectDonationForm(data=request.POST)
if form.is_valid():
stripe.api_key = settings.STRIPE_SECRET_KEY
name = request.POST.get(''name'', '''')
address = request.POST.get(''address'', '''')
city = request.POST.get(''city'', '''')
state = request.POST.get(''state'', '''')
zip = request.POST.get(''zip'', '''')
phone_number = request.POST.get(''phone_number'', '''')
support = request.POST.get(''support'', '''')
agree = request.POST.get(''agree'', '''')
email_address = request.POST.get(''email_address'', '''')
number = request.POST.get(''number'', '''')
cvc = request.POST.get(''cvc'', '''')
exp = request.POST.get(''exp'', '''')
# token = form.cleaned_data[''stripe_token''],
# exp_m = int(request.POST.get(''exp_month'', ''''))
# exp_y = int(request.POST.get(''exp_year'', ''''))
exp_month = exp[0:2]
exp_year = exp[5:9]
subject = ''New Donation''
from_email = settings.DEFAULT_FROM_EMAIL
recipient_list = [''deniselarkins@//////////.com'',
''charles@//////////.net'',
''marcmunic@//////////.com'',
]
token = stripe.Token.create(
card={
''number'': number,
''exp_month'': exp_month,
''exp_year'': exp_year,
''cvc'': cvc
},
)
customer = stripe.Customer.create(
email=email_address,
source=token,
)
total_support = decimal.Decimal(support) / 100
total_charge = decimal.Decimal(int(support)) / 100
# Charge the user''s card:
charge = stripe.Charge.create(
amount=total_charge,
currency=''usd'',
description=''Donation'',
customer=customer.id
)
ctx = {
''name'': name,
''address'': address,
''city'': city,
''state'': state,
''zip'': zip,
''phone_number'': phone_number,
''email_address'': email_address,
''agree'': agree,
''charge'': charge,
''customer'': customer,
''total_support'': total_support,
''total_charge'': total_charge
}
message = get_template(''email_forms/direct_donation_form_email.html'').render(Context(ctx))
msg = EmailMessage(subject, message, from_email=from_email, to=recipient_list)
msg.content_subtype = ''html''
msg.send(fail_silently=True)
return redirect(
''/contribute/donation-support-thank-you/?name='' + name +
''&address='' + address +
''&state='' + state +
''&city='' + city +
''&zip='' + zip +
''&phone_number='' + phone_number +
''&email_address='' + email_address +
''&total_support='' + str(total_support) +
''&total_charge='' + str(total_charge)
)
context = {
''title'': ''Donation Pledge'',
}
return render(request, ''contribute/_donation-application.html'', context)
En Django 1.8+ , el método de render
la plantilla toma un diccionario para el parámetro de context
. El soporte para pasar una instancia de Context
está en desuso , y da un error en Django 1.10+.
En su caso, solo use un dict
regular en lugar de una instancia de Context
:
message = get_template(''email_forms/direct_donation_form_email.html'').render(ctx)
Es posible que prefieras usar el render_to_string
directo render_to_string
:
from django.template.loader import render_to_string
message = render_to_string(''email_forms/direct_donation_form_email.html'', ctx)