29.06.2009 15:46

  1. Здравствуйте!
    Я начал использовать 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

    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. Почему то возвращает 'pop(): dictionary is empty'...
  4. Ой, вру! Спасибо, так работает.
  5. anonymous

    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. Ага, спасибо вам большое!

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

    0 ↑
    0 ↓
    А можно ли таким способом передать в шаблон переменную?


    Не очень понял вопрос, опишите задачу подробнее, пожалуйста.
  8. Например в функции check_out я получил unit_price = 35.67, как мне эту переменную unit_price передать в шаблон и вывести {{ unit_price }} при условии что доступа к render я не имею. Или, если сказать точнее, код django-paypal трогать не хочется.
  9. Да, вопрос наверно некорректен, надо искать другой способ передать переменную в шаблон.
  10. anonymous

    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. Ох, проглядел :). Спасибо вам за помощь!

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