2013-03-26 2 views
0

У меня есть следующие модели:Используя одну форму для двух аналогичных моделей

class BaseAddress(models.Model): 
    name = models.CharField(max_length=100) 
    business_name = models.CharField(max_length=100, blank=True, null=True) 
    address = models.CharField(max_length=100, blank=True, null=True) 
    address_2 = models.CharField(max_length=100, blank=True, null=True) 
    address_3 = models.CharField(max_length=100, blank=True, null=True) 
    city = models.CharField(max_length=100, blank=True, null=True) 
    state = models.CharField(max_length=2, blank=True, null=True) 
    zip_code = models.CharField(max_length=10, blank=True, null=True) 
    phone = models.CharField(max_length=30, blank=True, null=True) 

    class Meta: 
     abstract = True 



class ProfileBilling(BaseAddress): 
    profile = models.OneToOneField(
     Profile, related_name='billing_info') 

class OrderBilling(BaseAddress): 
    order = models.OneToOneField(Order, related_name='billing') 
    name_on_card = models.CharField(max_length=100) 
    #card_type = models.PositiveSmallIntegerField(
    # choices=CARD_TYPE, default=0) 
    #card_number = models.CharField(
    # max_length=16, default=0) 
    expire_month = models.PositiveSmallIntegerField(
     choices=MONTHS, null=True, default=0) 
    expire_year = models.PositiveSmallIntegerField(
     choices=YEARS, null=True, default=1960) 

Когда клиенты ввести платежный адрес, я хочу сохранить его в OrderBilling, но я также хочу, чтобы сохранить его в ProfileBilling как их наиболее последний платежный адрес. Как мне это сделать?

Как мне использовать формы для сохранения адреса фактуры в двух разных таблицах, когда у OrderBilling и ProfileBilling есть большинство тех же полей ...?

Как это сделать в Django?

Вот моя OrderBilling форма:

class OrderBillingForm(forms.ModelForm): 

class Meta: 
    model = OrderBilling 
    exclude = ('order',) 

def __init__(self, *args, **kwargs): 
    super(OrderBillingForm, self).__init__(*args, **kwargs) 
    self.fields['address'].required = True 
    self.fields['city'].required = True 
    self.fields['state'] = USStateField() 
    self.fields['zip_code'] = us.USZipCodeField() 
    self.fields['phone'].required = False 
    self.fields['expire_month'].required = False 
    self.fields['expire_year'].required = False 

def clean(self): 
    return self.cleaned_data 

ответ

0

Вы можете переопределить save() метод, но разумный способ в вашем случае будет использовать post_save сигнал для этой цели.

После того, как OrderBilling сохранятся, вы можете сохранить его данные в ProfileBilling.

взгляд на какой-то, например, на поиск Google в случае быть знакомым с сигналом post_save,

как:

то легко в вашем приемнике post_save | callback funcstion получите OrderBilling экземпляр

orderbil_instance = kwargs['instance'] 

И создать ProfileBilling из своих данных

ProfileBilling.objects.create(name=orderbil_instance.name, ....) 

Нечто подобное на post_save приемник сигнала

def do_something(sender, **kwargs): 
    # Getting OrderBilling instance which get saved just now 
    orderbil_instance = kwargs['instance'] 
    # Save the data into new ProfileBilling 
    ProfileBilling.objects.create(name=orderbil_instance.name, ....) 
+0

Как использовать post_save, чтобы сделать это? Я знаю, что я вызываю post_save (savetoprofile, sender = OrderBilling), но как использовать аргументы в savetoprofile для сохранения в ProfileBilling? –

+0

я сделал следующее: четкости save_to_profile (отправитель, экземпляр, созданный, ** kwargs): ProfileBilling.create ( адреса = instance.address, address_2 = instance.address_2, города = instance.city, состояние = экземпляр .state, zip_code = instance.zip_code) post_save (save_to_profile, sender = OrderBilling) –

+0

@JotaOnasys Только что обновил ответ;) –

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