2016-09-21 6 views
1

Ich baue eine app in Django 1.9 mit den Modellen Kunden und Adressen:Wie erstellt man ein Formular für verschachtelte Modelle?

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) 

: Ich bin in Django, so verzeihen Sie mir bitte, wenn diese zu viel Fehler hat.

Ich möchte einen neuen Kunden mit einem Formular erstellen:

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'})) 

Aber ich will noch in der Lage sein, die Adresse hinzuzufügen. Ich habe ein paar Sachen über verschachtelte Formulare gelesen, aber ich habe es nicht verstanden.

Könnten Sie bitte helfen, ein Formular zu erstellen, das einen Kunden mit Name, E-Mail, Telefonnummer und Adresse erstellt?

Antwort

0

Ich habe es herausgefunden! :)

Sie müssen die save Methode des Formulars überschreiben.

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 
Verwandte Themen