我正在使用付款系统。点击按钮后,我向外部rest api(Stripe)提交付款,一旦成功,它会返回一个名为“token”的javascript对象。我将“token”对象存储在隐藏的html字段中,然后使用jquery提交我的表单。之后,我使用CreateView来保存PaymentForm(它基于下面列出的支付模型)。 Payment模型具有子StripeToken模型的ForeignKey字段
我的问题是,在视图或表单中的哪一点解析json字符串并创建将与Payment对象关联的StripeToken对象?
我不确定这是否适用于formset,因为嵌套数据是从外部源(Stripe rest api)获取的,而不是嵌套表单。
我的模特:
class Payment(models.Model):
amount = CurrencyField()
name = models.CharField(max_length=255)
stripe_token = models.ForeignKey('StripeToken')
class StripeToken(models.Model):
token_id = models.CharField(max_length=255)
token_object = models.CharField(max_length=5)
type = models.CharField(max_length=12)
used = models.BooleanField()
livemode = models.BooleanField()
created = models.DateTimeField()
答案 0 :(得分:1)
我已通过表单的__init__
方法解决了这个问题。 “stripe_data”是包含json字符串的隐藏字段的名称。如下所示,我首先检查stripe_data是否在self.data中。接下来,我使用json.loads解析字符串。然后我创建必要的StripeToken对象并相应地分配它。
这对我有用。如果有更合适的方法可以做到这一点,那么我很想知道如何做到这一点。
import json
class PaymentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PaymentForm, self).__init__(*args, **kwargs)
if 'stripe_data' in self.data:
stripe_data = json.loads(self.data.get('stripe_data', None))
token = stripe_data['token']
stripe_token = StripeToken()
stripe_token.token_id = token.get('id', None)
stripe_token.token_object = token.get('object', None)
stripe_token.type = token.get('type', None)
stripe_token.used = token.get('used', None)
stripe_token.livemode = token.get('livemode', None)
stripe_token.created = token.get('created', None)
stripe_token.save()
self.data['stripe_token'] = stripe_token.id
<强>更新强>
以上不是最佳方法。相反,最好将非模型字段添加到条带数据的表单
class PaymentForm(forms.ModelForm):
stripe_data = forms.CharField(widget=forms.HiddenInput())
然后将表单__init__
中的上述内容移到表单的clean()
方法中。