2016-09-21 59 views
1

我建立一个应用程序在Django 1.9与机型的用户和地址:如何构建嵌套模型的表单?

class Customers(models.Model): 
    name = models.CharField(db_column='NAME', max_length=400) 
    email = models.CharField(db_column='EMAIL', max_length=255, unique=True) 
    phone_number = models.CharField(db_column='PHONE_NUMBER', max_length=200, blank=True, null=True) 
    address = models.ForeignKey(Addresses, db_column='ADDRESS_ID', related_name='customer_address', null=True) 

class Addresses(models.Model): 
    street = models.TextField(db_column='STREET', max_length=2000) 
    city = models.CharField(db_column='CITY', max_length=400, blank=True, null=True) 
    postal_code = models.CharField(db_column='POSTAL_CODE', max_length=200, blank=True, null=True) 
    country = models.ForeignKey(Country, db_column='COUNTRY_ID', null=True) 

我在Django新的,所以请原谅我,如果这有太多的失误。

我想用一种形式来创建一个新的客户:

class CustomersForm(ModelForm): 
    name = forms.CharField(label=_(u'Name'), widget=TextInput()) 
    email = forms.CharField(label=_(u'Email'), widget=TextInput()) 
    phone_number = forms.IntegerField(label=_(u'Phone Number'), required=False, widget=TextInput(attrs={'style': 'width:80px'})) 

但我还是希望能够添加地址。我读了一些关于嵌套表单的东西,但我不明白。

请问您是否可以帮助建立一个可以创建名称,电子邮件地址,电话号码和地址的客户表单?

回答

0

我想通了! :)

您必须覆盖表格的save方法。

class CustomersForm(ModelForm): 

    name = forms.CharField(label=_(u'Name'), widget=TextInput()) 
    email = forms.CharField(label=_(u'Email'), widget=TextInput()) 

    a_street = forms.CharField(label=_(u'Street'), widget=TextInput(), required=False) 
    a_postal_code = forms.CharField(label=_(u'Postal Code'), widget=TextInput(), required=False) 
    a_city = forms.CharField(label=_(u'City'), widget=TextInput(), required=False) 
    a_country = forms.CharField(label=_(u'Country'), widget=TextInput(), required=False) 

    # Override the save method like this 
    def save(self, commit=True): 
     c = super(CustomersForm, self).save(commit=False) 

     # Address 
     if c.address: 
      a = c.address 
     else: 
      a = Addresses() 
     a.street = self.cleaned_data.get('a_street') 
     a.city = self.cleaned_data.get('a_city') 
     a.postal_code = self.cleaned_data.get('a_postal_code') 
     a.country = self.cleaned_data.get('a_country') 

     if commit: 
      a.save() 
      c.address = a 
      c.save() 
     return c