У меня есть модель магазина (называемая StoreItem) с объектами в ней, причем цена является одним из атрибутов модели. Эти элементы магазина уже отображаются на веб-странице, поэтому при нажатии на изображение элемента появляется информация об этом элементе. Я хотел бы использовать django-PayPal для отображения уникальной кнопки покупки для каждого из этих элементов магазина. Мне бы хотелось, чтобы атрибут цены кнопки был получен непосредственно из цены соответствующего объекта магазина, как это установлено в базе данных через страницу администрирования django.
Я успешно настроил кнопку django-paypal «Купить сейчас», выполнив следующие инструкции: https://django -paypal.readthedocs.io / en / stable / standard / ipn.html
Однако, это создает только одну кнопку с суммой цены в виде строки. Мне нужно много разных уникальных кнопок, количество кнопок меняется в зависимости от количества объектов StoreItem, и каждая из которых имеет цены, полученные непосредственно от этих объектов. Я искал в интернете и до сих пор не видел примеров того, как этого добиться.
Пока что лучшее, что я могу понять, - это перебрать все объекты StoreItem.objects, которые не были проданы, создать форму PayPal для кнопки «Купить сейчас» для этого объекта и сохранить каждую форму PayPal в массив. Или я мог бы просто создать массив, содержащий информацию paypal_dict для каждого объекта (названный pp_dict в моем коде ниже).
Затем я мог бы перебрать массив, содержащий формы PayPal (названный pp_forms в моем коде ниже), и сохранить эту форму в моем контексте с помощью следующего кода:
for i in range(len(pp_forms)):
form = PayPalPaymentsForm(initial=pp_dicts[i])
new_context = {'form_{}'.format(i): form}
context.update(new_context)
Это создает контекст с form_0, form_1, form_2 ... и т. Д. Для максимально возможного количества объектов хранилища. Единственная проблема? Я не могу понять, как отобразить их все с тегами шаблона. Я мог бы напечатать:
{{ form_0.sandbox }} <-- (or form_0.render for actual payments) -->
Это работает, но, насколько я знаю, нет способа сделать что-то вроде:
{% for i in (number of unsold store objects) %}
{{ form_{}.sandbox | (put str(i) as a string in place of {} here) }}
{% endfor %}
Есть ли способ выполнить то, что я хочу достичь, что на самом деле работает? Помощь
Я немного новичок в тегах django и template, а также в django-paypal, и мне все это не кажется интуитивно понятным.
Ниже показан мой соответствующий код:
def view_that_asks_for_money(request):
pp_dicts = []
pp_forms = []
for item in StoreItem.objects.filter(sold=False):
# What you want the button to do.
paypal_dict = {
'business': settings.PAYPAL_RECEIVER_EMAIL,
'amount': str(item.price),
'item_name': 'Order_{}'.format(item.id),
"currency_code": "USD",
'invoice': str(item.id),
'notify_url': request.build_absolute_uri(reverse('paypal-ipn')), # the url where info gets stored
'return': request.build_absolute_uri(reverse('payment_done')), # return-view
'cancel_return': request.build_absolute_uri(reverse('payment_cancel')), # cancel-view
}
pp_dicts += [paypal_dict]
pp_forms += [PayPalPaymentsForm(initial=paypal_dict)]
# Create the instance
context = {}
for i in range(len(pp_forms)):
form = PayPalPaymentsForm(initial=pp_dicts[i])
new_context = {'form_{}'.format(i): form}
context.update(new_context)
new_context = {
'store_available': StoreItem.objects.filter(sold=False),
#... other stuff in my context could go here
}
context.update(new_context)
return render(request, "payment.html", context)