Я пытаюсь запустить приложение перенаправления Django, оно работает с некоторыми переадресациями, которые у меня есть в базе данных, но не со всеми из них.Переадресация конфликтов с шаблонами URL Django
Те, которые соответствуют одному из моих шаблонов url 404 без перенаправления, остальное в порядке.
urlpatterns = [
...
url(r'^(?P<category>[-\w]+)/$', views.SubCategoryListView.as_view(),
name='category_list'),
url(r'^(?P<category>[-\w]+)/(?P<slug>[-\w]+)/$',
views.content_or_sub_category, name='choice')
...
]
Например, предположим, что URL 'example.com/foo/bar' должен перенаправлять. Он будет соответствовать второму шаблону url выше, отправляется на content_or_sub_category
, который проверяет, является ли «foo» допустимой категорией или нет, и если «bar» является допустимым слипом. Найдя, что это не так, это 404s (как в коде ниже) и не перенаправляет.
В документации говорится
Каждый раз, когда любое приложение Django выдает ошибку 404, это промежуточное программное проверяет базу данных перенаправляет для запрашиваемого URL в качестве последнего средства.
https://docs.djangoproject.com/en/1.8/ref/contrib/redirects/
Но вместо редиректа пиная в любое время 404 поднятым это, кажется, только в том случае, если Django не находит шаблон соответствия.
Как это должно вести себя?
Я нашел этот вопрос Raise 404 and continue the URL chain о том, как возобновить оценку остальных шаблонов URL-адресов, если один 404s, но похоже, что это то, что вы не можете или не должны делать.
Единственный ответ на этот вопрос предложил ввести некоторую логику в ваш urls.py, но для этого нужно проверить правильность URL-адреса, а затем составить список urlpatterns
в зависимости от того, действителен он или нет. Я googled и не мог найти способ сделать это из urls.py.
Я использую Django 1.8.
class SubCategoryListView(ListView):
model = Content
queryset = Content.objects.published()
paginate_by = 15
def get_queryset(self):
qs = super(SubCategoryListView, self).get_queryset()
if 'category' in self.kwargs:
if self.kwargs['category'] is not None:
qs = qs.filter(
categories__slug__contains=self.kwargs['category'])
return qs
def get_context_data(self, **kwargs):
context = super(SubCategoryListView, self).get_context_data(**kwargs)
if 'category' in self.kwargs and self.kwargs['category'] is not None:
context['category'] = get_object_or_404(Category,
slug=self.kwargs[
'category'])
return context
...
def content_or_sub_category(self, **kwargs):
sub_category = get_object_or_false(Category.objects.sub_categories(),
slug=kwargs['slug'])
content = get_object_or_false(Content.objects.published(),
slug=kwargs['slug'])
if content:
return ContentDetailView.as_view()(self, **kwargs)
if sub_category:
return ContentListView.as_view()(self,
**{'category': kwargs['category'],
'sub_category': kwargs['slug']})
raise Http404
Некоторые переадресовывает, которые не работают:
/46421 --> /economy/has-prime-minister-broken-promise-tax-credits/
/are-living-standards-on-the-rise --> /economy/are-living-standards-rise/
/articles/nhs_budget_cut-28646 --> /economy/has-nhs-budget-been-cut/
Но что-то вроде это работа:
/health/live/2015/jan/number_12_hour_wait_hospital_bed_accident_emergency-38409 --> /health/spike-numbers-waiting-12-hours-e-hospital-bed/
Средство связывается с любыми 404, а не только когда шаблон не найден. Можете ли вы показать записи db для своих переадресаций? – knbk
Вот что я подумал, учитывая то, что говорят документы. Добавлены некоторые примеры, они не могут показать их всем, потому что их более 6000. – Jenna