2012-07-24 15 views
7

これはおそらく簡単な質問ですが、私はDjango Docsからそれを理解できないようです。私は2つのModelFormを一度に別のものに保存しようとしています。私はこれらの問題を確実に解決するために、ビューにロジックを書き込む方法がわかりません。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の1ページで複数のフォームを処理するための適切な方法](http://stackoverflow.com/questions/1395807/properway-to-handle-multiple-forms-on-one-page- –

+1

答えのいくつかはあなたを助けてくれましたか? –

+1

すべてのアクティブなStackOverflowユーザーのために、動作するソリューションを取得した場合、答えが不要な場合に人々が時間を費やさないように、回答を受け入れたものとしてマークしてください。 –

答えて

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を参照してください。

関連する問題