Приветствую.
С формы в Django приходит токен который генерируется платежной системой. Я объявляю форму с одним скрытым полем, которое принимает токен. Js либа платежки создаёт свою форму и генерирует поля для ввода. При совпадении имен hidden input django и платёжной системы(получаем 2 hidden input), токен не приходит никуда и получаем ''Token'' : [" "," "]. При изменении имени поля в коде Django получаем токен по имени js формы "Token":["token"], "Djangoinput"[" "]. Суть проблемы в том что
я не хочу менять views платформы, а ограничиться изменениями в файле forms.py для данной конкретной платежной системы.
Если кратко то? переопределить входящие в форму параметры, и записать в Djangoinput токен, который приходит в **kwargs.
Что приходит в **kwargs __init__ формы.
{'data':
<QueryDict: {'csrfmiddlewaretoken': ['****'],
'Token': ['tokn_test_5ezewjccegvcnzm6exn'],
'Source': [''],
'Djangoinput': [''],
'username': ['']}>
}
Кода формы:
class PaymentForm(forms.Form):
Djangoinput = forms.CharField(widget=forms.HiddenInput, required=True)
def __init__(self, payment_information, gateway_params, *args, **kwargs):
token = None
initial_arguments = kwargs.get('data', None)
if initial_arguments:
token = initial_arguments.get('Token', None)
csrf = initial_arguments.get('csrfmiddlewaretoken', None)
# Now update the form's initial values
if token:
data_test={}
data_test['Djangoinput'] = [token,]
data_test['csrfmiddlewaretoken'] = csrf
kwargs.update({'data' : data_test})
super(PaymentForm, self).__init__(*args, **kwargs)
self.fields['Paymentforms'] = forms.CharField(
widget=PayCheckoutWidget(
payment_information=payment_information,
gateway_params=gateway_params),
required=False)
Валится в form.is_valid() требует ввода данных в hidden input.
Обход проблемы доступен путем удаление поля Django по id в js и это работает.
Однако, смотря на другие уже встроенные платежные системы вижу, что видимо библиотеки генерируют поля сами, но умеют определять уже созданное в форме поле(с правильным именем) и передавать в него данные, без генерации своего поля, что помогает им работать с этой Dajngo платформой. Вообщем хотелось бы иметь 2 hiddeninput с разными именами и возможностью передать токен в поле djangoinput в forms.py. Возможно туплю =)
Django 2.1.5
Python 3.6.6