2017-01-19 5 views
0

(Django v 1.10.4) Я пытаюсь использовать два отдельных приложения, которые являются корневым сайтом для сайта (я переношу на django с другого сайта и нуждаюсь для поддержания существующей структуры URL-адресов). Эти два приложения/модели - «artistbio/Bio» и «pages/BasicPage». В настоящее время у меня есть шаблоны URL в главном URL-адрес конфигурации (первоначально они были в своих соответствующих url.py файлов, но проблема у меня есть одно и то же так или иначе):Янтарный шаблон URL-адреса Django в двух конфликтах отдельных приложений

from django.conf.urls import include, url 
from django.contrib import admin 
from django.conf import settings 
from artistbio.views import BioDetail 
from pages.views import PageDetail 


urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^(?P<slug>[\w\-]+)/', PageDetail.as_view()), 
    url(r'^(?P<slug>[-\w]+)/', BioDetail.as_view(), name='bio-detail'), 

Все, что я прочитал (и все мой опыт до сих пор) показал, что Django будет пытаться сопоставить запрос с каждым шаблоном URL-адреса, прежде чем давать либо ошибку «не совпадать с шаблонами url», либо ошибку «404 не найден», если запрошенный объект действительно не существует. Но теперь, когда оба шаблона объединены, как указано выше, когда я запрашиваю объект Bio через BioDetail, он пытается сопоставить шаблон URL-адреса для PageDetail и дает мне ошибку 404 (что имеет смысл), но это также означает, что Django никогда не перемещается на следующий шаблон URL, где он, безусловно, будет соответствовать. Если я их переключу и поставлю шаблон BioDetail над шаблоном PageDetail, как и ожидалось, я получаю доступ к объектам Bio, но не к объектам страницы.

Я прочитал каждую применимую запись StackOverflow, которую я смог найти, прочитал все официальные документы и назвал Django Unleashed, но все еще, похоже, не хватает решения!

ответ

2

От Django documentation:

Когда пользователь запрашивает страницу с вашего Django питанием сайта, это алгоритм системы следует определить, какой Python код для выполнения:

  1. Джанго определяет root URLconf для использования. Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут urlconf (устанавливается промежуточным программным обеспечением), его значение будет использоваться вместо параметра ROOT_URLCONF.
  2. Django загружает этот модуль Python и ищет переменные urlpatterns. Это должен быть список Python экземпляров django.conf.urls.url() .
  3. Django просматривает каждый шаблон URL по порядку и останавливается на первом, который соответствует запрашиваемому URL.
  4. Когда одно из регулярных выражений совпадает, Django импортирует и вызывает данное представление, которое представляет собой простую функцию Python (или представление на основе класса). [...]

Сосредоточьтесь на точке 3: Джанго прекратить обрабатывать urlpatterns переменную как только регулярное выражение проверки текущего URL. Он вызывает представление, и если эти представления возвращают 404, ошибка возвращается клиенту.

Django не будет продолжать соответствовать URL со следующими узорами, если вид вернулся через 404.

Так в основном, чтобы решить проблему, вы должны написать мнение, что совпадает с URL, анализировать слизняк и попробуйте получить соответствующие Page или Bio (в этом порядке). Но я предлагаю вам запланировать переход на систему, где страницы и Bio имеют собственное представление для отображения содержимого.

+0

Благодарим вас за ответ Antwane. Поэтому я считаю, что то, что я пытаюсь сделать, просто невозможно? Если нет, я просто объединить обе модели в одну и двигаться дальше. – brandondavid

+0

Да, это невозможно, если вы сами не разработаете особый вид для обработки этого конкретного случая (см. Конец ответа). – Antwane

+0

У вас определенно должны быть разные схемы URL-адресов для художников и страниц, иначе в один прекрасный день у вас будет страница и художник с похожими слизнями, а другой будет теневым другим (или вам понадобится «страница с неоднозначными значениями»), которая является своего рода kludge). FWIW, имеющий все URL-адреса исполнителей с префиксом «/ artist /», делает идеальное чувство ИМХО даже от SEO POV. –