2013-12-09 3 views
1

Я работаю с платежной системой. При нажатии кнопки я отправляю платеж внешнему ави (Stripe), а после успеха возвращает объект javascript, называемый «токен». Я сохраняю объект «токен» в скрытом html-поле, а затем отправляю свою форму с помощью jquery. После этого я использую CreateView для сохранения PaymentForm (который основан на модели оплаты, приведенной ниже). Модель платежа имеет поле ForeignKey для ребенка. Модель StripeTokenDjango: Как создать дочерние объекты на основе представленных json-данных

Мой вопрос в том, в какой точке зрения или формы я разбираю строку json и создаю объект StripeToken, который будет связан с объектом Payment?

Я не уверен, что это случай для форм, потому что вложенные данные получены из внешнего источника (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

я решил это через __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() метод формы.

Смежные вопросы