2012-07-24 25 views
7

Esta es probablemente una pregunta bastante simple, pero parece que no puedo entenderlo desde Django Docs. Intento guardar dos ModelForms a la vez, siendo uno ForeignKey de otro. No estoy seguro de cómo escribir la lógica en las vistas para asegurar que estas funcionen correctamente.Guardar Django ModelForm con 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()) 

Cualquier ayuda sería ap apreciado ¡Gracias!

+2

Esto ayuda [Forma correcta de manejar múltiples formularios en una página en Django] (http://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple-forms-on-one-page- in-django) –

+1

¿Alguna de las respuestas lo ayudó? –

+1

Por el bien de todos los usuarios activos de StackOverflow, si obtiene una solución que funcione, marque la respuesta como aceptada, para que las personas no pierdan el tiempo respondiendo si ya no se necesita una respuesta. –

Respuesta

14

Django proporciona inline formsets para este caso de uso:

formsets Inline es una pequeña capa de abstracción en la parte superior de formsets modelo. Esto simplifica el caso de trabajar con objetos relacionados a través de una clave extranjera.

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

Por favor, véase también este question para más detalles.

Cuestiones relacionadas