Reputation: 66
How to make the django redirects a user to the page I need?
I have a web app. For example a user is on a page with an address local:8000/detail-order/18. This page is detail info of the order 18. On this page is link to edit this order. When a user clicks this link a order editing form shows up. When a user writes in this form and click the submit button, he has an error. I whould like that a user goes back to local:8000/detail-order/18.
NoReverseMatch at /update-orders/18
Reverse for 'detail_order' with no arguments not found. 1 pattern(s) tried: ['detail\-order/(?P[0-9]+)$']
Request Method: POST
Request URL: http://192.168.0.249:8000/update-orders/18
Django Version: 3.0.5
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'detail_order' with no arguments not found. 1 pattern(s) tried: ['detail\-order/(?P[0-9]+)$']
Exception Location: /root/.local/share/virtualenvs/myp4-4l8n6HJk/lib/python3.7/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 677
urls.py
from django.contrib import admin
from django.urls import path, include
from .views import *
from print import views
urlpatterns = [
path('', views.home_page, name='index'),
path('orders', views.OrderCreateView.as_view(), name='orders'),
path('update-orders/<int:pk>', views.UpdateOrderView.as_view(), name='update_order'),
path('delete-orders/<int:pk>', views.DeleteOrderView.as_view(), name='delete_order'),
path('detail-order/<int:pk>', views.DetailOrderView.as_view(), name='detail_order'),
]
views.py
class UpdateOrderView(CustomSuccessMessageMixin, UpdateView):
model = Order
template_name = 'orders.html'
form_class = OrderForm
success_url = reverse_lazy('detail_order')# HERE
success_msg = 'Изменения сохранены'
def get_context_data(self, **kwargs):
kwargs['update'] = True
return super().get_context_data(**kwargs)
Upvotes: 1
Views: 47
Reputation: 477608
You can override the .get_success_url(..)
method [Django-doc] and thus inject parameters:
from django.urls import reverse
class UpdateOrderView(CustomSuccessMessageMixin, UpdateView):
model = Order
template_name = 'orders.html'
form_class = OrderForm
success_msg = 'Изменения сохранены'
def get_context_data(self, **kwargs):
kwargs['update'] = True
return super().get_context_data(**kwargs)
def get_success_url(self):
return reverse('detail_order', kwargs={'pk': self.object.pk})
Upvotes: 2