Search code examples
djangohttpresponse

Django: The view didn't return an HttpResponse object. It returned None instead


I keep getting this error when I try to use my 'edit' url.

The view to_do_list_app.views.edit didn't return an HttpResponse object. It returned None instead.

my url.py

urlpatterns = [
    path('', views.todo, name='todo'),
    path('delete/<job_id>', views.delete, name='delete'),
    path('cross_off/<job_id>', views.cross_off, name='cross_off'),
    path('uncross/<job_id>', views.uncross, name='uncross'),
    path('edit/<job_id>', views.edit, name='edit'),
]

from django.db import models.py

class Jobs(models.Model):
    # Relationships
    to_do_owner = models.ForeignKey("auth.User", on_delete=models.SET_NULL, blank=True, null=True)

    # Fields
    item = models.CharField(max_length=200)
    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.item +' | ' +  str(self.completed)

Here is my veiws.py

from django.shortcuts import render, redirect
from .models import Jobs
from .forms import ListForm
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required

def edit(request, job_id):
    if request.method == 'POST':
        item = Jobs.objects.get(pk=job_id)
        form = ListForm(request.POST or None, instance=item)
        if form.is_valid() and request.POST['item'] != '':
            form.save()
            messages.success(request, request.POST['item']+ ' er blevet redigeret i din opgave list')
            return HttpResponseRedirect('todo')
    else:
        item =Jobs.objects.get(pk=job_id)
        context = {'item': item}
        return render(request, 'edit.html', context)

And here I have my template edith.html

<form class="d-flex" method="POST" action="{% url 'edit' item.id %}">
      {% csrf_token %}
        <input class="form-control me-2" type="search" placeholder="{{  item.item  }}"
               value="{{  item.item  }}" aria-label="Search" name="item">
        <input type="hidden" value="{{  user.username  }}" name="job_owner">
        <input type="hidden" value="{{  item.completed  }}" name="completed">
        <button class="btn btn-outline-secondary" type="submit">Rediger opgave</button>
    </form>

The output for self.check_response(response, callback) is:

callback
<function edit at 0x7f07ac82b430> callback_args () callback_kwargs
{'job_id': '5'} middleware_method <bound method CsrfViewMiddleware.process_view of <django.middleware.csrf.CsrfViewMiddleware object at 0x7f07ac89b760>> request
<WSGIRequest: POST '/todo/edit/5'> response
None self
<django.core.handlers.wsgi.WSGIHandler object at 0x7f07adbea760> wrapped_callback
<function edit at 0x7f07ac82b430>


Solution

  • You can do it like :-

    def edit(request, job_id):
        if request.method == 'POST':
            item = Jobs.objects.get(pk=job_id)
            form = ListForm(request.POST or None, instance=item)
            if form.is_valid() and request.POST['item'] != '':
                form.save()
                messages.success(request, request.POST['item']+ ' er blevet redigeret i din opgave list')
                return HttpResponseRedirect('todo')
        else:
            item =Jobs.objects.get(pk=job_id)
    
        context = {'item': item}
        return render(request, 'edit.html', context)
    

    What i have edited :- Indentation of last two lines