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)
Migrado de Django 1.8 a Django 1.11.6
Dondequiera que haya una clase RequestContext, hay un método flatten () que devuelve el resultado como un dict.
Así que si la clase es RequestContext ….
return t.render(context)
se convierte en
return t.render(context.flatten())
Y en un caso en el que el contexto está envuelto por Context (), simplemente elimínelo. Debido a que Context () está en desuso.
return t.render(Context(ctx))
se convierte en
return t.render(ctx)
para django 1.11 y después, el contexto debe ser dict. puedes utilizar :
context_dict = get_context_dict(context) return t.render(context_dict)
o
context_dict = context.flatten() return t.render(context_dict)