2009-04-09 32 views
32

¿Cómo obtengo la clave principal después de guardar un ModelForm? Después de que el formulario ha sido validado y guardado, me gustaría redirigir al usuario a la vista contact_details que requiere la clave principal del contacto.Obtener clave principal después de guardar un ModelForm en Django

def contact_create(request): 
    if request.method == 'POST': 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect(reverse(contact_details, args=(form.pk,))) 
    else: 
     form = ContactForm() 
+0

Exactamente lo que quería preguntar, gracias! +1 – CodyBugstein

Respuesta

47

save El método ModelForm 's devuelve el objeto guardado.

Prueba esto:

def contact_create(request): 
    if request.method == 'POST': 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      new_contact = form.save() 
      return HttpResponseRedirect(reverse(contact_details, args=(new_contact.pk,))) 
    else: 
     form = ContactForm() 
+0

¡Muchas gracias! – Matt

+0

No hay problema, eso se pasa por alto fácilmente y no es inmediatamente intuitivo. ;) – monkut

+0

¿Qué pasa con la función 'reverse'? – CodyBugstein

9

En el caso en que haya configurado form.save (commit = False) porque desea modificar los datos y tiene una relación de muchos a muchos, entonces la respuesta es un poco diferente:

def contact_create(request): 
    if request.method == 'POST': 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      new_contact = form.save(commit=False) 
      new_contact.data1 = "gets modified" 
      new_contact.save() 
      form.save_m2m() 
      return HttpResponseRedirect(reverse(contact_details, args=(new_contact.pk,))) 
    else: 
     form = ContactFrom() 

https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#the-save-method

Cuestiones relacionadas