Reputation: 484
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
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
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