Я нашел гораздо более чистое решение без изменения исходного кода благодаря множественному наследованию Python.
forms.py
from django import forms
from paypal.standard.widgets import ValueHiddenInput
from paypal.standard.forms import PayPalEncryptedPaymentsForm
class PayPalAddressFormMixin(forms.Form):
address1 = forms.CharField(widget=ValueHiddenInput())
address2 = forms.CharField(widget=ValueHiddenInput())
city = forms.CharField(widget=ValueHiddenInput())
country = forms.CharField(widget=ValueHiddenInput())
zip = forms.CharField(widget=ValueHiddenInput())
email = forms.CharField(widget=ValueHiddenInput())
first_name = forms.CharField(widget=ValueHiddenInput())
last_name = forms.CharField(widget=ValueHiddenInput())
class PayPalEncryptedPaymentsAddressForm(PayPalEncryptedPaymentsForm, PayPalAddressFormMixin):
pass
в views.py вы можете установить начальные значения как обычно
paypal_dict = {
# ...
# preopulate paypal checkout page
"email": invoice.user.email,
"first_name": invoice.user.first_name,
"last_name": invoice.user.last_name,
"address1": invoice.user.address.street,
"city": invoice.user.address.city,
"country": invoice.user.address.get_country_display,
"address_country_code": invoice.user.address.country
}
form = PayPalEncryptedPaymentsAddressForm(initial=paypal_dict)