Django:如何基于提交的json数据创建子对象
我正在使用一个支付系统。单击按钮后,我向外部RESTAPI(Stripe)提交一个付款,成功后,它返回一个名为“token”的javascript对象。我将“token”对象存储在一个隐藏的html字段中,然后使用jquery提交表单。之后,我使用CreateView保存PaymentForm(它基于下面列出的付款模型)。付款模型具有子StripeToken模型的ForeignKey字段 我的问题是,在视图或表单的哪个点上,我应该解析json字符串并创建将与支付对象关联的StripeToken对象 我不确定表单集是否存在这种情况,因为嵌套数据是从外部源(Stripe rest api)而不是嵌套表单获取的 我的模型: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对
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()
方法中