Django重定向 - 带有Slug的URL到URL的URL

时间:2018-05-11 16:12:47

标签: python django redirect

不确定我是否应该这样做......但是这里有。

我有一个看起来像这样的网址:

/deals/category/Apparel/

我将其更改为category/Apparel以缩短它。

但也要注意大写的服装 - 因为它使用了类别名称。

所以我向我的Category模型添加了一个slug,我试图重定向

deals/category/Apparelcategory/apparel,其中后者代表slu

在我的优惠应用中,我有以下网址:

path('category/<str:category>', RedirectView.as_view(pattern_name='category', permanent=True)),

我试图重定向到(在我的核心网址文件中)

path('category/<slug:slug>', deals_by_category, name='category')

我对`deals_by_category&#39;的看法看起来像这样:

def deals_by_category(request,slug):
    category_deals = Deal.objects.filter(category__slug=slug).order_by('expired','-date_added')
    category = category_deals[0].category
    return render(request, 'deals/category.html', {'category_deals': category_deals, 'category':category})

所以,当我转到deals/category/Apparel时,它会重定向到category/Apparel这不是我想要的......我收到的错误是这样的:

Reverse for 'category' with keyword arguments '{'category': 'Apparel'}' not found. 1 pattern(s) tried: ['category\\/(?P<slug>[-a-zA-Z0-9_]+)$']

我想我明白它正在查看类别名称并尝试匹配slug,但不确定如何正确地重定向格式正确。

1 个答案:

答案 0 :(得分:3)

path('category/<str:category>', RedirectView.as_view(pattern_name='category', permanent=True)),

当您使用pattern_name时,Django会尝试使用相同的args和kwargs来反转网址,在本例中为category='Apparel'

如果您想改用网址中的slug,那么您必须继承RedirectView并覆盖get_redirect_url

from django.shortcuts import get_object_or_404

class CategoryRedirectView(RedirectView):
    permanent = True

    def get_redirect_url(self, *args, **kwargs):
        category = get_object_or_404(Category, name=self.kwargs['category'])
        return reverse('category', kwargs={'slug': category.slug})

然后在您的网址格式中使用您的观点:

path('category/<slug:slug>', CategoryRedirectView.as_view(), name='category')

在您确定重定向按预期工作之前,我不会设置permanent = True。否则,浏览器可能会缓存错误的重定向。