среда, 26 июня 2013 г.

Настройка роутов, путей в urls.py фреймворка Django

Пусть мы только что создали проект project. В нем сделали приложение articles, в котором намереваемся хранить статьи. При этом мы хотим, чтобы при обращении в браузере по адресу http://127.0.0.1:8000/ у нас загружались urls.py этого приложения articles.

Вот главные роуты проекта: project/urls.py:

# ... начальные настройки

urlpatterns = patterns('',
    # подключаем настройки роутов приложения article
    url(r'', include('article.urls')),

    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    url(r'^admin/', include(admin.site.urls)),
)


Здесь видно, что при обращении к http://127.0.0.1:8000/ будет подключаться файл articles/urls.py:
# ...

urlpatterns = patterns('',

    url(r'^(?P[a-z]+)$', ArticleListView.as_view(), name='tag_article_list'),

    url(r'^(?P\d+)$', DetailView.as_view(
        model=Article,
        context_object_name='article',
        template_name='article/article.html'),
        name='article_detail'),

    url(r'', ListView.as_view(
        queryset=Article.objects.order_by('-published'),
        context_object_name='article_list',
        template_name='article/article_list.html'),
        name='article_list'),
)


Так нужно организовать url-паттерны, чтобы при обращении к корню сайта у нас загрузились url какого-то приложения.
НО! Не спешите! Поскольку в главном файле urls.py мы поместили url-паттерн в самое начало, у нас не будет доступна админка. Чтобы это исправить, поместите этот паттерн вниз:
# ... начальные настройки

urlpatterns = patterns('',

    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    url(r'^admin/', include(admin.site.urls)),

    # Паттерн охватывает все варианты роутов, поэтому его нужно поместить вниз,
    # чтобы дать шанс отработать тем паттернам, что расположены выше.
    url(r'', include('article.urls')),
)

Итак, мы получили урок:
в фреймворке Django для реализации своих задумок с конфигурацией url-паттерном нужно поиграть с порядком их следования.