64 votes

Django 1.11 TypeError contexte doit être un dict plutôt que du Contexte

Viens de recevoir la Sentinelle erreur TypeError context must be a dict rather than Context. sur l'un de mes formulaires. Je sais qu'il a quelque chose à voir avec Django 1.11, mais je ne suis pas sûr de ce changement pour le fixer.

La ligne incriminée

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

Vue D'Ensemble

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)

75voto

Alasdair Points 36535

Dans Django 1.8+, le modèle de l' render méthode prend un dictionnaire pour l' context paramètre. Soutien pour le passage d'un Context instance est obsolète, et donne une erreur dans Django 1.10+.

Dans votre cas, il suffit d'utiliser un dict au lieu de Context exemple:

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

Vous préférerez peut-être utiliser l' render_to_string raccourci:

from django.template.loader import render_to_string

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

Si vous utilisiez RequestContext au lieu de Context, alors vous devez passer l' request de ces méthodes en tant que bien de sorte que le contexte processeurs exécuter.

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)

20voto

VIctor Angelov Points 31

Migré à partir de Django 1,8 à Django 1.11.6

Partout où j'ai eu un RequestContext classe, il y a une méthode aplatir() qui retournera le résultat comme dict.

Donc, si la classe est RequestContext....

return t.render(context)

devient

return t.render(context.flatten())

Et dans un cas dont le contexte est enveloppé par le Contexte (le), suffit de le retirer. Parce que le Contexte() est obsolète.

return t.render(Context(ctx))

devient

return t.render(ctx)

2voto

Yvette Tan Points 3

pour django 1.11 et après, le contexte doit être dict. vous pouvez utiliser :

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

ou

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X