【问题标题】:Django PayPal & Additional OptionsDjango PayPal 和其他选项
【发布时间】:2010-09-09 20:09:52
【问题描述】:

我正在使用Django PayPal。贝宝有一个list of options,您可以通过您的按钮。我正在尝试将其中一些添加到我的paypal_dict

paypal_dict = {
    # ...

    # preopulate paypal checkout page
    "email": invoice.user.email,
    "first_name": invoice.user.first_name,
    "last_name": invoice.user.last_name,
    "address1": invoice.user.address.street,
    "city": invoice.user.address.city,
    "country": invoice.user.address.get_country_display,
    "address_country_code": invoice.user.address.country
}

form = PayPalPaymentsForm(initial=paypal_dict)

但是当我检查表单时,这些字段从未添加过。我怎样才能让它们被添加?

【问题讨论】:

  • 嗨,马克 - 只是一个快速的提醒,jonboxall 分支不是最新的 Django-Paypal - dcramer 是领先的,并且是要跟踪的主要分支。见github.com/dcramer/django-paypal/network
  • 啊.. 我知道有两个主要的分叉,但我不记得哪个更新了。无论哪个首先出现在谷歌我认为是更好的一个:p 无论如何..我必须检查一下我实际使用的是哪个,但是....我认为这仍然是 dcramer 版本中的一个问题,是不是吗?
  • 我真的不知道答案,因为我没有使用过 django-paypal,但是...在您在问题中链接到的文档中没有 email 变量,只有 @987654327 @ 和 payer_email。您列出的其他一些选项也是如此...
  • @Tomek:是的……但 PayPal 本身支持的选项远不止这些。
  • @Mark:您写道:“PayPal 有一个选项列表[...] 我正在尝试添加其中的一些[...]”,并提供了指向 PayPal 的 API 文档的链接。然后,您使用了链接文档中未记录的一些选项。然后你问我们,为什么他们不工作。所以我问你:“你为什么认为它们应该起作用?”

标签: django django-paypal


【解决方案1】:
【解决方案2】:

我破解了它:

def __init__(self, button_type="buy", extra_options={}, *args, **kwargs):
    super(PayPalPaymentsForm, self).__init__(*args, **kwargs)
    self.extra_options = extra_options
    self.button_type = button_type

def render(self):
    extra_fields = u''.join(['<input type="hidden" name="%s" value="%s" />' % (escape(name), escape(value)) for name, value in self.extra_options.iteritems()])          
    return mark_safe(u"""<form action="%s" method="post">
%s
%s
<input type="image" src="%s" border="0" name="submit" alt="Buy it Now" />
</form>""" % (POSTBACK_ENDPOINT, self.as_p(), extra_fields, self.get_image()))


def sandbox(self):
    extra_fields = u''.join(['<input type="hidden" name="%s" value="%s" />' % (escape(name), escape(value)) for name, value in self.extra_options.iteritems()])  
    return mark_safe(u"""<form action="%s" method="post">
%s
%s
<input type="image" src="%s" border="0" name="submit" alt="Buy it Now" />
</form>""" % (SANDBOX_POSTBACK_ENDPOINT, self.as_p(), extra_fields, self.get_image()))

【讨论】:

  • 为什么不在 github 上为 django-paypal 做贡献?
【解决方案3】:

感谢 Python 多重继承,我找到了更简洁的解决方案,无需修改原始代码。

forms.py

from django import forms
from paypal.standard.widgets import ValueHiddenInput
from paypal.standard.forms import PayPalEncryptedPaymentsForm


class PayPalAddressFormMixin(forms.Form):

    address1 = forms.CharField(widget=ValueHiddenInput())
    address2 = forms.CharField(widget=ValueHiddenInput())
    city = forms.CharField(widget=ValueHiddenInput())
    country = forms.CharField(widget=ValueHiddenInput())
    zip = forms.CharField(widget=ValueHiddenInput())

    email = forms.CharField(widget=ValueHiddenInput())
    first_name = forms.CharField(widget=ValueHiddenInput())
    last_name = forms.CharField(widget=ValueHiddenInput())


class PayPalEncryptedPaymentsAddressForm(PayPalEncryptedPaymentsForm, PayPalAddressFormMixin):
    pass

在views.py中你可以像往常一样设置初始值

paypal_dict = {
    # ...

    # preopulate paypal checkout page
    "email": invoice.user.email,
    "first_name": invoice.user.first_name,
    "last_name": invoice.user.last_name,
    "address1": invoice.user.address.street,
    "city": invoice.user.address.city,
    "country": invoice.user.address.get_country_display,
    "address_country_code": invoice.user.address.country
}

form = PayPalEncryptedPaymentsAddressForm(initial=paypal_dict)

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2013-11-26
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多