不确定我是否应该这样做......但是这里有。
我有一个看起来像这样的网址:
/deals/category/Apparel/
我将其更改为category/Apparel
以缩短它。
但也要注意大写的服装 - 因为它使用了类别名称。
所以我向我的Category
模型添加了一个slug,我试图重定向
deals/category/Apparel
到category/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,但不确定如何正确地重定向格式正确。
答案 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
。否则,浏览器可能会缓存错误的重定向。