Just received the Sentry error TypeError context must be a dict rather than Context. on one of my forms. I know it has something to do with Django 1.11, but I am not sure what to change to fix it.
Offending line
message = get_template('email_forms/direct_donation_form_email.html').render(Context(ctx))
Entire View
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)
In Django 1.8+, the template's render method takes a dictionary for the context parameter. Support for passing a Context instance is deprecated, and gives an error in Django 1.10+.
In your case, just use a regular dict instead of a Context instance:
message = get_template('email_forms/direct_donation_form_email.html').render(ctx) You may prefer to use the render_to_string shortcut:
from django.template.loader import render_to_string message = render_to_string('email_forms/direct_donation_form_email.html', ctx) If you were using RequestContext instead of Context, then you would pass the request to these methods as well so that the context processors run.
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)
Migrated from Django 1.8 to Django 1.11.6
Wherever i had a RequestContext class, there is a method flatten() wich return the result as a dict.
So if the class is RequestContext....
return t.render(context) becomes
return t.render(context.flatten()) And in a case wich the context is is wrapped by Context(), just remove it. Because Context() is deprecated.
return t.render(Context(ctx)) becomes
return t.render(ctx)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With