Philippe Haumesser
Philippe Haumesser

Reputation: 647

The view awesomeinventory.supplier.views.supplierCreateView didn't return an HttpResponse object. It returned None instead in Create view

My code is: views.py

class supplierListView(LoginRequiredMixin, ListView):
    template_name = "supplier/Supplier_list.html"

    def get_queryset(self):
        organisation = self.request.user.userprofile.company
        return Supplier.objects.filter(organisation=organisation)

class supplierCreateView(LoginRequiredMixin, CreateView):
    template_name = "supplier/supplier_create.html"
    form_class = SupplierModelForm

    def get_success_url(self):
        return reverse("supplier:supplier_list")

    def form_valid(self, form):
        supplier = form.save(commit=False)
        supplier.organisation = self.request.user.userprofile.company
        supplier.supplier_created_by = self.request.user
        supplier.save()

my urls:

from awesomeinventory.supplier.views import (
    supplierListView,
    supplierDetailView,
    supplierCreateView,
    supplierContactListView,
    supplierContactCreateView,
    supplierContactDetailView,

)

app_name = "supplier"
urlpatterns = [
    path("supplier_list/", view=supplierListView.as_view(), name="supplier_list"),
    path("supplier_create/", view=supplierCreateView.as_view(), name="supplier_create"),
    path("<int:pk>/detail/", view=supplierDetailView.as_view(), name="supplier_detail"),
    path("<int:pk>/update/", view=supplierDetailView.as_view(), name="supplier_update"),
    path("<int:pk>/delete/", view=supplierDetailView.as_view(), name="supplier_delete"),

    path("supplierContact_list/", view=supplierContactListView.as_view(), name="supplierContact_list"),
    path("<int:suppk>/supplierContact_create/", view=supplierContactCreateView.as_view(), name="supplierContact_create"), # int is supplier_id
    path("<int:pk>/Contact/detail/", view=supplierContactDetailView.as_view(), name="supplierContact_detail"),
]

I m able to go to supplier:supplier_list page and it works well.

But when I want to create a supplier with supplierCreateView, supplier is create but it seems to have an issue with get_success_url as I have error The view awesomeinventory.supplier.views.supplierCreateView didn't return an HttpResponse object. It returned None instead

Upvotes: 0

Views: 32

Answers (2)

Abdul Aziz Barkat
Abdul Aziz Barkat

Reputation: 21807

The method form_valid is supposed to return the response or redirect the user. In your implementation you only save the object and return nothing essentially returning None which gives you an error. Instead of using form.save(commit=False) you can simply modify the instance wrapped by the form and leave all the processing to the super classes form_valid:

class supplierCreateView(LoginRequiredMixin, CreateView):
    template_name = "supplier/supplier_create.html"
    form_class = SupplierModelForm

    def get_success_url(self):
        return reverse("supplier:supplier_list")

    def form_valid(self, form):
        form.instance.organisation = self.request.user.userprofile.company
        form.instance.supplier_created_by = self.request.user
        return super().form_valid(form)

Note: A class name should ideally be in PascalCase so SupplierCreateView instead of supplierCreateView

Upvotes: 2

Mubashar Javed
Mubashar Javed

Reputation: 1367

This will work for you.

from django.urls import reverse_lazy


class supplierCreateView(LoginRequiredMixin, CreateView):
    template_name = "supplier/supplier_create.html"
    form_class = SupplierModelForm

    def get_success_url(self):
        # pay attention I'm using reverse_lazy instead of reverse
        return reverse_lazy("supplier:supplier_list")

You can read more about reverse_lazy here.

Upvotes: 1

Related Questions