Django Function Update

I'm doing the update function but I get a message Page not found

enter image description here

views.py

def detalle_tarea(request, tarea_id):
  if request.method == 'GET':
       tarea = get_object_or_404(Tarea, pk=tarea_id)
       form = TareaForm(instance=tarea)
       return render(request, 'tarea_detalles.html', 
                {'tarea': tarea, 'form': form})
  else:
      tarea = get_object_or_404(Tarea, pk=tarea_id)
      form = TareaForm(request.POST, instance=tarea)
      form.save()
      return redirect('tareas')

url.py

from django.contrib import admin
from django.urls import path
from tareas import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.inicio, name='inicio'),
    path('registrar/', views.registrar, name='registrar'),
    path('tareas/', views.tareas, name='tareas'),
    path('tareas/crear/', views.crear_tarea, name='crear_tarea'),
    path('tareas/<int:tarea_id>/', views.detalle_tarea, name='detalle_tarea')
]

Any suggestion ???

The error from your screenshot is most likely occurring because you have incorrectly specified the action in <form> in your HTML template.

But aside from this error, there are a few other unclear points in your code that should be addressed.

First, duplication is unnecessary – it's simply pointless. Secondly, you are not validating the form and immediately starting to save it – this can also lead to unpleasant consequences.

I would rewrite your view function like this:

def detalle_tarea(request, tarea_id):
  # eliminating duplication
  tarea = get_object_or_404(Tarea, pk=tarea_id)

  if request.method == 'GET':
       form = TareaForm(instance=tarea)
       return render(request, 'tarea_detalles.html', 
                {'tarea': tarea, 'form': form})
  else:
      form = TareaForm(request.POST, instance=tarea)
      if form.is_valid():
        form.save()
        return redirect('tareas')
      else:
          # for example
          messages.error(request, "Validation error") 

I also recommend using print or logging for debugging, so you can understand if you're actually hitting your view function and what tarea_id you're getting.

For example:

def detalle_tarea(request, tarea_id):
    print(f'{tarea_id=}')

issue is related to the redirect function. When you use redirect you need to specify the name of the url pattern not the actual URL itself

enter code here
def detalle_tarea(request, tarea_id):
    if request.method == 'GET':
       tarea = get_object_or_404(Tarea, pk=tarea_id)
       form = TareaForm(instance=tarea)
       return render(request, 'tarea_detalles.html'{'tarea':tarea,'form':form})
    else:
       tarea = get_object_or_404(Tarea, pk=tarea_id)
       form = TareaForm(request.POST, instance=tarea)
       if form.is_valid():
          form.save()
          return redirect('tareas')
       else:
          return render(request, 'tarea_detalles.html', {'form': form, 'tarea': tarea})
Back to Top