Saif Khan
Saif Khan

Reputation: 484

How to redirect to a page after deleting in django?

I am trying to redirect to a page after deleting an object I don't know but it's not working. The object gets deleted but it doesn't redirect to any page can someone please help me ? If you need more code you can ask me. Thank you !

Views of deleting product

@login_required() 
def delete_product(request, product_id):
    delete = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=delete)
    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES, instance=delete)
        if form.is_valid():
            delete.delete()

            return redirect('store_details')
        else:
            form = NewPro(instance=delete)
    return render(request, "default/product_delete.html", {'form': form, 'delete': delete})

url pattern

from django.urls import path
from . import views
from stores.urls import views

app_name = 'stores'

urlpatterns = [
    path('<int:store_id>/store_details/', views.store_details, name='store_details'),

]

 urlpatterns = [
    path('<int:product_id>/product', views.product, name='products_details'),
    path('add_products/', views.pro, name='add_products'),
    path('', views.index_products, name='index_products'),
    path('<int:product_id>/detail_product', views.detail_product, name='detail_product'),
    path('<int:product_id>/edit_product', views.edit_product, name='edit_product'),
    path('<int:product_id>/delete_product', views.delete_product, name='delete_product')

]

Upvotes: 1

Views: 2876

Answers (2)

Youssef BH
Youssef BH

Reputation: 582

The error indicate that django cannot resolve the path of the view store_details. You can use the reverse method from django.urls.

from django.urls import reverse

@login_required() 
def delete_product(request, product_id):
    delete = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=delete)
    if request.method == 'POST':
        # if this form is not valid we rander it again, so no need for else statement
        form = NewPro(request.POST, request.FILES, instance=delete)
        if form.is_valid():
            delete.delete()
            return redirect(reverse('stores:store_details'))
    # if it's not POST method render an empty form    
    else:
        form = NewPro()
    return render(request, "default/product_delete.html", {'form': form, 'delete': delete})

urls.py of product app:

from django.urls import path
from . import views

app_name = 'product'

urlpatterns = [
    path('<int:product_id>/product', views.product, name='products_details'),
    path('add_products/', views.pro, name='add_products'),
    path('', views.index_products, name='index_products'),
    path('<int:product_id>/detail_product', views.detail_product, name='detail_product'),
    path('<int:product_id>/edit_product', views.edit_product, name='edit_product'),
    path('<int:product_id>/delete_product', views.delete_product, name='delete_product')
]

urls.py of stores app:

from django.urls import path
from . import views

app_name = 'stores'

urlpatterns = [
    path('<int:store_id>/store_details/', views.store_details, name='store_details'),
]    

app_name attribute in the included URLconf module help in the reverse resolution of URLs

I hope this will help.

Upvotes: 2

Kevin Hernandez
Kevin Hernandez

Reputation: 1400

You're not setting the form for the post request, move the else: back a tab.

Correct Syntax:

@login_required() 
def delete_product(request, product_id):
    delete = get_object_or_404(Product, pk=product_id)
    form = NewPro(instance=delete)
    if request.method == 'POST':
        form = NewPro(request.POST, request.FILES, instance=delete)
        if form.is_valid():
            delete.delete()

            return redirect('store_details')
    else:
        form = NewPro(instance=delete)
    return render(request, "default/product_delete.html", {'form': form, 'delete': delete})

Upvotes: 0

Related Questions