Django:如何根据提交的json数据创建子对象

时间:2013-12-09 21:52:23

标签: django json django-forms django-views

我正在使用付款系统。点击按钮后,我向外部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()

1 个答案:

答案 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()方法中。