2013-12-09 85 views
1

我正在使用付款系統。點擊按鈕後,我將付款提交給外部rest api(Stripe),並在成功時返回一個名爲「token」的javascript對象。我將「token」對象存儲在一個隱藏的html字段中,然後使用jquery提交我的表單。之後,我使用CreateView保存PaymentForm(基於下面列出的付款模式)。付款模式有一個子項StripeToken模型的外鍵字段Django:如何根據提交的json數據創建子對象

我的問題是,在視圖或窗體的哪一點我解析json字符串並創建將與付款對象關聯的StripeToken對象?

我不確定這是否爲formset的情況,因爲嵌套數據是從外部源(條紋休息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

我已經通過了形式的__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 

UPDATE

以上是不是最好的方法。相反,它是最好的非模型字段添加到窗體的磁條數據

class PaymentForm(forms.ModelForm): 
    stripe_data = forms.CharField(widget=forms.HiddenInput()) 

再往前什麼形式的__init__上述到窗體的clean()方法。