2016-01-07 2 views
0

Я пытаюсь запустить приложение перенаправления 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/ 
+0

Средство связывается с любыми 404, а не только когда шаблон не найден. Можете ли вы показать записи db для своих переадресаций? – knbk

+0

Вот что я подумал, учитывая то, что говорят документы. Добавлены некоторые примеры, они не могут показать их всем, потому что их более 6000. – Jenna

ответ

1

Не уверен, что return ContentDetailView.as_view()(self, **kwargs) есть, но в общем, если вы хотите перенаправить , вы должны использовать что-то по строкам:

return redirect(reverse('category_list', args=[ARG1, ARG2])) 

Где «category_list» - это имя шаблона url, и ARG1 & ARG2 - это аргументы, которые вы хотите в URL-адресе.

+0

Не знаю, спасибо, спасибо! – Jenna

+0

Без проблем! Если бы это был правильный ответ, обязательно нажмите галочку слева от моего ответа, чтобы кто-нибудь, кто наткнулся на этот поток, будет знать, что делать – Hybrid

+0

Не совсем, 'return ContentDetailView.as_view() (self, ** kwargs) ', но ваша версия понятна.Вещь, которая не работает, перенаправляется со старого URL-адреса страницы на новый, используя приложение перенаправления. – Jenna