Sergei Sokov
Sergei Sokov

Reputation: 66

How to make the django redirects a user to the page I need?

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

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

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

Related Questions