Пусть мы только что создали проект project. В нем сделали приложение articles, в котором намереваемся хранить статьи. При этом мы хотим, чтобы при обращении в браузере по адресу http://127.0.0.1:8000/ у нас загружались urls.py этого приложения articles.
Вот главные роуты проекта: project/urls.py:
Здесь видно, что при обращении к http://127.0.0.1:8000/ будет подключаться файл articles/urls.py:
Так нужно организовать url-паттерны, чтобы при обращении к корню сайта у нас загрузились url какого-то приложения.
НО! Не спешите! Поскольку в главном файле urls.py мы поместили url-паттерн в самое начало, у нас не будет доступна админка. Чтобы это исправить, поместите этот паттерн вниз:
Итак, мы получили урок:
в фреймворке Django для реализации своих задумок с конфигурацией url-паттерном нужно поиграть с порядком их следования.
Вот главные роуты проекта: 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-паттерном нужно поиграть с порядком их следования.
Это просто, это есть в документации. А вот как получить полный путь 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 текущего поста.
Можно использовать мощь тэга django url tag.
УдалитьВ urls.py приложения нужно для роута обозначить имя (в данной статье это было name="article_detail"). Затем в шаблоне путь к данной статье можно получить при помощи тэга url:
для следующей статьи: {% url 'article_detail' pk=next %}
для предыдущей статьи: {% url 'article_detail' pk=prev %}