1. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Здравствуйте!
    Я начал использовать django-paypal метод оплаты Pro, вот кусок кода как это выглядит во views.py:
    def check_out(request):
    if request.user.is_authenticated:
    user = AccountUser.objects.get(username=request.user)
    ...
    if user.payment == 2:
    item = {'amt': unit_price,
    'cancelurl': "http://%s/cancel/" % current_site,
    'returnurl': "http://%s/success/" % current_site}

    kwargs = {'item':item,
    'payment_template': 'cart/paypal_payment.html',
    'payment_form_cls': SimplePaymentForm,
    'success_url': '/success',
    }
    ppp = PayPalPro(**kwargs)
    Сама форма унаследована от PaymentForm:
    from paypal.pro.forms import PaymentForm

    class SimplePaymentForm(PaymentForm):
    firstname = forms.CharField(max_length=255, widget=forms.HiddenInput())
    lastname = forms.CharField(max_length=255, widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
    super(SimplePaymentForm, self).__init__(*args, **kwargs)
    Вопрос в следующем, как мне не меняя код django-paypal передать в переопределённый __init__ значение текущего request.user, чтоб потом через initial заполнять поля формы SimplePaymentForm значение которых уже есть в User? Или есть другой способ?
  2. anonymous

    29.06.2009

    0 ↑
    0 ↓
    class SimplePaymentForm(PaymentForm):
    ...
    def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user')
    super(SimplePaymentForm, self).__init__(*args, **kwargs)

    def check_out(request):
    def form_factory(*args, **kwargs):
    kwargs['user'] = request.user
    return SimplePaymentForm(*args, **kwargs)
    ...
    kwargs = {
    'payment_form_cls': form_factory,
    ...
  3. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Почему то возвращает 'pop(): dictionary is empty'...
  4. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Ой, вру! Спасибо, так работает.
  5. anonymous

    29.06.2009

    0 ↑
    0 ↓
    Возможно так будет проще:
    from django.utils.functional import curry

    class SimplePaymentForm(PaymentForm):
    ...
    def __init__(self, user, *args, **kwargs):
    super(SimplePaymentForm, self).__init__(*args, **kwargs)
    self.user = user

    def check_out(request):
    form_factory = curry(SimplePaymentForm, request.user)
    ...
    kwargs = {
    'payment_form_cls': form_factory,
    ...
  6. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Ага, спасибо вам большое!

    А можно ли таким способом передать в шаблон переменную? Или есть другие способы?
  7. anonymous

    29.06.2009

    0 ↑
    0 ↓
    А можно ли таким способом передать в шаблон переменную?
    Не очень понял вопрос, опишите задачу подробнее, пожалуйста.
  8. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Например в функции check_out я получил unit_price = 35.67, как мне эту переменную unit_price передать в шаблон и вывести {{ unit_price }} при условии что доступа к render я не имею. Или, если сказать точнее, код django-paypal трогать не хочется.
  9. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Да, вопрос наверно некорректен, надо искать другой способ передать переменную в шаблон.
  10. anonymous

    29.06.2009

    0 ↑
    0 ↓
    Беглое разглядывание кода django-paypal показывает, что PayPalPro в качестве аргумента принимает context.
    kwargs = {
    'context': {'unit_price': 35.67} # Передавайте в шаблон что надо
    'item':item,
    'payment_template': 'cart/paypal_payment.html',
    'payment_form_cls': SimplePaymentForm,
    'success_url': '/success',
    }
    ppp = PayPalPro(**kwargs)
  11. Grigory Fateyev

    29.06.2009

    0 ↑
    0 ↓
    Ох, проглядел :). Спасибо вам за помощь!

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.