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

Django:如何基于提交的json数据创建子对象,django,json,django-forms,django-views,Django,Json,Django Forms,Django Views,我正在使用一个支付系统。单击按钮后,我向外部RESTAPI(Stripe)提交一个付款,成功后,它返回一个名为“token”的javascript对象。我将“token”对象存储在一个隐藏的html字段中,然后使用jquery提交表单。之后,我使用CreateView保存PaymentForm(它基于下面列出的付款模型)。付款模型具有子StripeToken模型的ForeignKey字段 我的问题是,在视图或表单的哪个点上,我应该解析json字符串并创建将与支付对象关联的StripeToken对

我正在使用一个支付系统。单击按钮后,我向外部RESTAPI(Stripe)提交一个付款,成功后,它返回一个名为“token”的javascript对象。我将“token”对象存储在一个隐藏的html字段中,然后使用jquery提交表单。之后,我使用CreateView保存PaymentForm(它基于下面列出的付款模型)。付款模型具有子StripeToken模型的ForeignKey字段

我的问题是,在视图或表单的哪个点上,我应该解析json字符串并创建将与支付对象关联的StripeToken对象

我不确定表单集是否存在这种情况,因为嵌套数据是从外部源(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()

我已经通过表单的
\uuuu init\uuu
方法解决了这个问题。“stripe_data”是包含json字符串的隐藏字段的名称。如下所示,我首先检查stripe_数据是否在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())

然后将上面在表单的
\uuuuu init\uuuu
中描述的内容移动到表单的
clean()
方法中。

我已经通过表单的
\uuuuu init\uuu
方法解决了这个问题。“stripe_data”是包含json字符串的隐藏字段的名称。如下所示,我首先检查stripe_数据是否在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())
然后将上面在表单的
\uuu init\uu
中描述的内容移动到表单的
clean()
方法中