2012-07-24 261 views
7

這可能是一個相當簡單的問題,但我似乎無法從Django Docs中找到它。我試圖一次保存兩個ModelForms,一個是另一個的ForeignKey。我不確定如何在視圖中編寫邏輯以確保這些邏輯正確地結合在一起。用外鍵保存Django ModelForm

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()) 

任何幫助將是AP preciated。謝謝!

+2

這是否有幫助[正確的方法來處理多個表單在Django中的一個頁面上](http://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple-forms-on-one-page- in-django) – 2012-07-24 21:17:44

+1

有些答案對你有幫助嗎? – 2012-07-29 21:30:07

+1

爲了所有活躍的StackOverflow用戶,如果您得到可行的解決方案,請將答案標記爲已接受,這樣如果不再需要答案,人們就不會花時間回答問題。 – 2012-08-01 06:49:43

回答

14

Django的用於該用途的情況下提供inline formsets

內嵌表單集是上模型表單集的頂部上的小的抽象層。 這些簡化了通過外鍵 鍵處理相關對象的情況。

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()) 

請另見本question瞭解更多詳情。