wake-up-neo.com

Django 1.11 TypeError-Kontext muss ein Diktat und kein Kontext sein

Habe gerade den Sentry-Fehler TypeError context must be a dict rather than Context. Auf einem meiner Formulare erhalten. Ich weiß, dass es etwas mit Django 1.11 zu tun hat, aber ich bin nicht sicher, was ich ändern soll, um es zu beheben.

Beleidigende Zeile

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

Gesamte Ansicht

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 = ['[email protected]/////\\\\\.com',
                              '[email protected]/////\\\\\.net',
                              '[email protected]/////\\\\\.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)
41
Studio Rooster

In Django 1.8 + verwendet die render -Methode der Vorlage ein Wörterbuch für den context -Parameter. Unterstützung für die Übergabe einer Context -Instanz wird nicht mehr empfohlen und gibt einen Fehler in Django 1.10+.

Verwenden Sie in Ihrem Fall einfach eine reguläre dict anstelle einer Context -Instanz:

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

Möglicherweise bevorzugen Sie die Verwendung von render_to_string Verknüpfung:

from Django.template.loader import render_to_string

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

Wenn Sie RequestContext anstelle von Context verwenden, würden Sie das request auch an diese Methoden übergeben, damit die Kontextprozessoren ausgeführt werden.

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)
53
Alasdair

Migriert von Django 1.8 zu Django 1.11.6

Überall dort, wo ich eine RequestContext-Klasse hatte, gibt es eine Methode flatten (), die das Ergebnis als Dikt zurückgibt.

Also, wenn die Klasse RequestContext ist ....

return t.render(context)

wird

return t.render(context.flatten())

Und in einem Fall, in dem der Kontext von Context () umschlossen ist, entfernen Sie ihn einfach. Weil Context () veraltet ist.

return t.render(Context(ctx))

wird

return t.render(ctx)
9
VIctor Angelov

Für Django 1.11 und später muss der Kontext diktiert werden.

Sie können verwenden:

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

oder

context_dict = context.flatten()
return t.render(context_dict)
0
Yvette Tan