0
votes

I'm trying to edit items on a form on a page called 'website/edit1,2,3,4,...'

When I click 'edit' after editing the form items, I get the error above. None of the errors on the site resembles a solution. The tutorial I was following (and now trying to add my own edit function) says to import HttpResponseRedirect and not HttpResponse as in the solutions on S/O. Anyways, here's the views.py file

from django.shortcuts import render, redirect
from .models import List
from .forms import ListForm
from django.contrib import messages
from django.http import HttpResponseRedirect

def home(request):
    all_items = List.objects.all
    return render(request, 'home.html', {'all_items': all_items})

def about(request):
    return render(request, 'about.html', {})

def edit(request, item_id):
    if request.method == 'POST':
        item = List.objects.get(pk=item_id)
        form = ListForm(request.POST or None, instance=item)
        if form.is_valid():
            form.save()
            messages.success(request, ('Item Had Been Edited'))
            return redirect('home')

    else:
        item = List.objects.get(pk=item_id)
        return render(request, 'edit.html', {'item': item})

def delete(request, item_id):
    item = List.objects.get(pk=item_id)
    item.delete()
    return redirect('home')

Here's the urls.py file

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('about', views.about, name='about'),
    path('delete/<item_id>', views.delete, name='delete'),
    path('edit/<item_id>', views.edit, name='edit')
]

.. . and the forms.py file

from django import forms
from .models import List

class ListForm(forms.ModelForm):
    class Meta:
        model = List
        fields = ["First_name", "Surname", "Street", "Town", "Province", "Postal_code"]
2
If the form.is_valid() returns False, you do not return anything. Normally you rerender the form.Willem Van Onsem
else: ... return render(request, 'edit.html', {'item': item}) possible wrong indentationAlvi15

2 Answers

0
votes

You forgot to put an else condition for invalid form:

def edit(request, item_id):
    if request.method == 'POST':
        item = List.objects.get(pk=item_id)
        form = ListForm(request.POST or None, instance=item)
        if form.is_valid():
            form.save()
            messages.success(request, ('Item Had Been Edited'))
            return redirect('home')
        else:
            return render(request, 'edit.html', {'item': item})
    else:
        item = List.objects.get(pk=item_id)
        return render(request, 'edit.html', {'item': item})
0
votes

Your condition should have were next to go if method is not yet posted.

else:
    item = List.objects.get(pk=item_id)
    return render(request, 'edit.html', {'item': item})