【问题标题】:how to redirect back to the same page in a RedirectView Django如何在 RedirectView Django 中重定向回同一页面
【发布时间】:2018-12-29 07:01:50
【问题描述】:

我有下面的视图我正在尝试将用户重定向到下面的同一页面是我的 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')

但我收到一个页面未找到 (404) 错误。

以下是我的 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})

以下是我的 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'),

下面是我的 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 %}

逻辑有效。如果我回去刷新按钮颜色已经改变。我怎样才能让返回重定向工作

【问题讨论】:

  • 可能是因为get_object_or_404(OrderItem, pk=pk)
  • @WillemVanOnsem 但它得到的项目我已经检查了带有打印语句pkuserobj 的代码的所有打印此外,如果我单击返回并刷新。代码有效,按钮颜色已更改。它只是不工作的重定向部分

标签: django python-3.x django-templates django-views


【解决方案1】:

我只是将返回重定向更改为返回反向并且它起作用了

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

【讨论】:

  • reverse 将 url 作为字符串返回。 redirect 返回一个 HttpResponseRedirect 对象。当您继承和覆盖方法时,您必须确保您的方法返回正确的返回类型。 RedirectView.get_redirect_url() 的文档可在此处获得:ccbv.co.uk/projects/Django/2.0/django.views.generic.base/…
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 2012-07-16
  • 2021-12-20
  • 2012-06-13
  • 1970-01-01
  • 2012-09-27
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多