среда, 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-паттерном нужно поиграть с порядком их следования.

2 комментария:

  1. Это просто, это есть в документации. А вот как получить полный путь url для элемента при выводе контекста? Пример:
    def get_context_data(self, **kwargs):
    context = super(ArticleDetailView, self).get_context_data(**kwargs)
    context['next'] = self.get_next()
    context['prev'] = self.get_prev()
    return context

    То бишь я интересуюсь знать, как вывести в шаблоне полный путь к предыдущей/следующей публикации. Писать {{next}} не вариант, это просто добавляет id следующей статьи к url текущего поста.

    ОтветитьУдалить
    Ответы
    1. Можно использовать мощь тэга django url tag.

      В urls.py приложения нужно для роута обозначить имя (в данной статье это было name="article_detail"). Затем в шаблоне путь к данной статье можно получить при помощи тэга url:


      для следующей статьи: {% url 'article_detail' pk=next %}


      для предыдущей статьи: {% url 'article_detail' pk=prev %}

      Удалить