2012-07-24 17 views
7

Das ist wahrscheinlich eine ziemlich einfache Frage, aber ich kann es nicht aus den Django Docs herausfinden. Ich versuche, zwei ModelForms gleichzeitig zu speichern, wobei einer der ForeignKey eines anderen ist. Ich bin mir nicht sicher, wie ich die Logik in die Ansichten schreiben soll, um sicherzustellen, dass diese richtig zusammenpassen.Speichern von Django ModelForm mit einem ForeignKey

models.py

class Address(models.Model): 
    address = models.CharField(max_length=100) 
    city = models.CharField(max_length=50) 
    zipcode = models.PositiveIntegerField() 

class Store(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.CharField(max_length=140, blank=True) 
    address = models.ForeignKey(Address, null=True) 

forms.py

class CreateStore1Form(forms.ModelForm): 
    class Meta: 
     model = Store 
     exclude = ('address',) 

class CreateStore2Form(forms.ModelForm): 
    class Meta: 
     model = Address 

views.py

@login_required 
def create(request): 
    if request.method == "POST": 
     form1 = CreateStore1Form(request.POST) 
     form2 = CreateStore2Form(request.POST) 
     if form1.is_valid() and form2.is_valid(): 
      store = form1.save(address) 
      new_address = form2.save(commit=False) 
      new_address.store = store 
      mew_address.save() 
    else: 
     form1 = CreateStore1Form() 
     form2 = CreateStore2Form() 
    return render(request, 'create.html', locals()) 

Jede Hilfe ap wäre genervt. Vielen Dank!

+2

Hilft dies [Die richtige Methode zur Handhabung mehrerer Formulare auf einer Seite in Django] (http://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple-forms-on-one-page- in-django) –

+1

Haben dir einige Antworten geholfen? –

+1

Für alle aktiven StackOverflow-Benutzer, wenn Sie eine funktionierende Lösung erhalten, markieren Sie die Antwort als akzeptiert, so dass die Leute keine Zeit darauf verwenden, zu antworten, wenn die Antwort nicht mehr benötigt wird. –

Antwort

14

Django bietet inline formsets für diesen Anwendungsfall:

Inline Formularsätze ist eine kleine Abstraktionsschicht auf der Oberseite des Modells Formularsätze. Diese vereinfachen den Fall der Arbeit mit verwandten Objekten über einen fremden Schlüssel .

forms.py

class AddressForm(forms.ModelForm): 
    class Meta: 
     model = Address 

class StoreForm(forms.ModelForm): 
    class Meta: 
     model = Store 
     exclude = ('address',) 

views.py

from django.forms.models import inlineformset_factory 

@login_required 
def create(request):  
    AddressInlineFormSet = inlineformset_factory(Address, Store, form=AddressForm) 

    if request.method == 'POST': 
     storeForm = StoreForm(request.POST) 

     if storeForm.is_valid(): 
      new_store = storeForm.save() 
      addressInlineFormSet = AddressInlineFormSet(request.POST, request.FILES, instance=new_store) 

      if addressInlineFormSet.is_valid(): 
       addressInlineFormSet.save() 
       return HttpResponseRedirect(reverse('some_happy_customer_url')) 

      else: 
       classificationformset = ClassificationInlineFormSet(request.POST, request.FILES, instance=new_store) 
    else: 
      addressInlineFormSet = AddressInlineFormSet() 
      storeForm = StoreForm() 
    return render(request, 'create.html', locals()) 

Bitte beachten Sie auch diese question für weitere Details.

Verwandte Themen