Samir Tendulkar
Samir Tendulkar

Reputation: 1191

how to redirect back to the same page in a RedirectView Django

I have the below view I am trying to Redirect the user to the same page below are my views.py

class TastingPickedToggle(LoginRequiredMixin, RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        pk = self.kwargs.get('pk')
        obj = get_object_or_404(OrderItem, pk=pk)
        user = obj.order.buyer

        if user in obj.picked.all():
            obj.picked.remove(user)
        else:
            obj.picked.add(user)
        return redirect('order:tasting_sold_orders')

but I get a Page not found (404) error.

below are my models.py

class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items_in_this_order')
picked = models.ManyToManyField(User, blank=True, related_name='item_picked')

   def get_absolute_url(self):
        return reverse('order:tasting_sold_detail', kwargs={'username': self.order.buyer.username,
                                                            'pk': self.pk})

    def get_picked_url(self):
        return reverse('order:pick', kwargs={'username': self.order.buyer.username,
                                             'pk': self.pk})

below are my urls.py

urlpatterns = [


    url(r'^tasting_sold_orders/$', views.TastingsSoldOrders.as_view(), name='tasting_sold_orders'),

    url(r'^(?P<username>[-\w]+)/(?P<pk>\d+)/pick/$', views.TastingPickedToggle.as_view(), name='pick'),

below are my templates.py

  {% if order.order.buyer in order.picked.all %}
    <a href="{{ order.get_picked_url }}"><button class="btn btn-success">Picked</button></a>
   {% else %}
     <a href="{{ order.get_picked_url }}"><button class="btn btn-default">Not picked</button></a>
  {% endif %}

The logic works. If I go back and refresh the button colors have changed. how can I get the return redirect to work

Upvotes: 0

Views: 501

Answers (1)

Samir Tendulkar
Samir Tendulkar

Reputation: 1191

I just changed the return redirect to return reverse and it worked

class TastingPickedToggle(LoginRequiredMixin, RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        pk = self.kwargs.get('pk')
        obj = get_object_or_404(OrderItem, pk=pk)
        user = obj.order.buyer

        if user in obj.picked.all():
            obj.picked.remove(user)
        else:
            obj.picked.add(user)
        return reverse('order:tasting_sold_orders') #just changed this to reverse and it worked

Upvotes: 2

Related Questions