2012-02-14 32 views
5

Estoy creando un formulario en una página, luego en otra página estoy tratando de sacar el formulario (rellenado con los datos guardados en él) y me gustaría hacer cambios en él para que cuando Lo guardo, sobrescribe la instancia en lugar de crear otra.Formulario de actualización Django

def edit(request): 

    a = request.session.get('a', None) 
    form = Name_Form(request.POST, instance=a) 
    if form.is_valid(): 
      j = form.save(commit=False) 
      j.save() 

Parece que funciona pero no completa la forma. En su lugar, se inicia con un formulario en blanco que ya ha sido "presentado" en blanco (ver todos los errores que le dice acerca de los campos obligatorios)

También he intentado usar

form = Name_Form(initial={'id':a.id}) 

a rellenar previamente el formulario. Pero si hago esto en lugar de la línea form = Name_Form(request.POST, instance=a), no sobrescribirá la instancia, sino que creará una nueva.

Parece que no puedo combinar ambas funciones.

Cualquier ayuda se agradece

Respuesta

6

Si configura la forma con request.POST, llenará todos los campos del formulario con valores eso en encuentra dentro de los datos POST. Si hace esto en una solicitud GET (donde request.POST está vacío), la completa con valores vacíos.

Probar:

def edit(request): 

    a = request.session.get('a', None) 

    if a is None: 
     raise Http404('a was not found') 

    if request.method == 'POST': 
     form = Name_Form(request.POST, instance=a) 
     if form.is_valid(): 
      j = form.save(commit=False) 
      j.save() 
    else: 
     form = Name_Form(instance = a) 
+0

En serio. Gracias. No tienes idea de cuánta frustración me ha traído tratar de resolver esto. – JohnnyCash

+1

No estoy seguro de si nunca funcionó, o si por alguna razón ya no funciona , ¡pero ya no sobrescribe la instancia! ¡Está creando una nueva, o si ya existe, devuelve un error! :(¿Ideas? – JohnnyCash

3

No añadir request.POST a menos que sea realmente allí:

def edit(request): 

    a = request.session.get('a', None) 
    if request.method == 'POST': 
     form = Name_Form(request.POST, instance=a) 
     if form.is_valid(): 
       j = form.save(commit=False) 
       j.save() 
    else: 
     form = Name_Form(instance=a) 
+0

Gracias por su respuesta! ¡no está sobrescribiendo la instancia! Está creando uno nuevo, o si ya existe, ¡devuelve un error! :(Ideas? – JohnnyCash

+0

Hmm, es posible que tenga que publicar el error, suena como un problema diferente. Quizás relacionado con sacar una 'a' de la sesión? –

+0

Es solo un error de integridad debido al campo non_field_errors en la plantilla. (I ' ve los campos definidos como unique_together) – JohnnyCash

Cuestiones relacionadas