11

これはおそらくかなり単純な質問ですが、Django Docs からは理解できないようです。一度に 2 つの ModelForms を保存しようとしていますが、一方は別の 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)

フォーム.py

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

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

ビュー.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())

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

20

Django は、このユース ケース用にインライン フォームセットを提供します。

インライン フォームセットは、モデル フォームセットの上にある小さな抽象化レイヤーです。これらは、外部キーを介して関連オブジェクトを操作するケースを簡素化します。

フォーム.py

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

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

ビュー.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())

詳細については、この質問も参照してください。

于 2012-07-24T21:42:30.103 に答える