Django-Paypal: Как создать уникальную форму Django-PayPal для каждого объекта в модели магазина, а затем отобразить кнопки «Купить сейчас» с тегами шаблона? - PullRequest
0 голосов
/ 06 января 2019

У меня есть модель магазина (называемая 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)
...