La edición del formulario en Django crea una nueva instancia

Estoy editando el formulario, carga los datos correctamente, compro cuando golpeo guardar, crea una nueva entrada en la base de datos.

Aquí están las funciones de visualización.

def create_account(request): if request.method == 'POST': # If the form has been submitted... form = AccountForm(request.POST, request.FILES) # A form bound to the POST data if form.is_valid(): # All validation rules pass form.save() return HttpResponseRedirect('/thanks/') # Redirect after POST else: form = AccountForm() # An unbound form return render_to_response('account_form.html', { 'form': form, }) 

 def edit_account(request, acc_id): f = Account.objects.get(pk=acc_id) if request.method == 'POST': # If the form has been submitted... form = AccountForm(request.POST, request.FILES) # A form bound to the POST data if form.is_valid(): # All validation rules pass form.save() return HttpResponseRedirect('/thanks/') # Redirect after POST else: form = AccountForm(instance=f) # An unbound form return render_to_response('account_form.html', { 'form': form, }) 

¿Realmente necesito tener una función separada de edición y una separación para eliminar? ¿Puedo hacer todo en una función?

modelo

   {% csrf_token %} {% for field in form %} 
{{ field.errors }} {{ field.label_tag }}: {{ field }}
{% endfor %}

Te estás perdiendo el argumento de la instance en la sección POST .

En lugar de esto:

 form = AccountForm(request.POST, request.FILES) # A form bound to the POST data 

Deberías usar esto:

 form = AccountForm(request.POST, request.FILES, instance=f) # A form bound to the POST data 

Una vez que lo agregue al formulario de agregar / editar, podrá agregar / editar al mismo tiempo.

Se agregará si instance=None y se actualizará si la instance es una cuenta real.

 def edit_account(request, acc_id=None): if acc_id: f = Account.objects.get(pk=acc_id) else: f = None if request.method == 'POST': # If the form has been submitted... form = AccountForm(request.POST, request.FILES, instance=f) # A form bound to the POST data if form.is_valid(): # All validation rules pass form.save() return HttpResponseRedirect('/thanks/') # Redirect after POST else: form = AccountForm(instance=f) # An unbound form return render_to_response('account_form.html', { 'form': form, }) 

¿Has intentado algo como ésto?

  # Create a form to edit an existing Object. a = Account.objects.get(pk=1) f = AccountForm(instance=a) f.save() # Create a form to edit an existing Article, but use # POST data to populate the form. a = Article.objects.get(pk=1) f = ArticleForm(request.POST, instance=a) f.save()