Переадресация Django - URL-адрес со строкой в ​​URL-адрес со слагом - PullRequest
0 голосов
/ 11 мая 2018

Не уверен, должен ли я делать это или нет ... но здесь идет.

У меня есть URL, который выглядит так:

/deals/category/Apparel/

Я изменил его на category/Apparel, чтобы сократить его.

, но также заметил заглавную одежду - поскольку она использует имя категории.

Поэтому я добавил слаг в свою модель Categoryи я пытаюсь перенаправить

deals/category/Apparel на category/apparel, где последний представляет слаг

В моем приложении сделок у меня есть этот URL:

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

и к которому я пытаюсь перенаправить (в моем основном файле urls)

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

Мой взгляд на `deal_by_category 'выглядит следующим образом:

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_]+)$']

Я думаю, я понимаю, что это смотрит на название категории ипытается сопоставить слизняком, но не совсем уверен, как правильно перенаправить его в правильном формате.

1 Ответ

0 голосов
/ 11 мая 2018
path('category/<str:category>', RedirectView.as_view(pattern_name='category', permanent=True)),

Когда вы используете pattern_name, Django попытается перевернуть URL с теми же аргументами и кваргами, в этом случае category='Apparel'.

Если вы хотите использовать slug ввместо этого URL, тогда вам нужно будет создать подкласс 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})

. Затем используйте свое представление в шаблоне URL:

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

Я бы не стал устанавливать permanent = True, пока вы не убедитесь, что перенаправление работает должным образом.В противном случае браузеры могут кэшировать неправильные перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...