Хостинг Django от «Джино»
Table of contents

Подключение других схем URL

Если вы планируете использовать ваш код в нескольких Django сайтах, вам следует переработать ваш файл со схемой URL таким образом, чтобы он позволял включать другие схемы.

В любом случае ваша схема может «подключать» другие схемы. По существу происходит «внедрение» набора URL после этой команды. Например:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^weblog/', include('mysite.blog.urls')),
    (r'^photos/', include('mysite.photos.urls')),
    (r'^about/$', 'mysite.views.about'),
)

Здесь есть важный момент: регулярные выражения в этом примере, которые указывают на include() не имеют символа $, но имеют завершающий слэш. Когда Django встречает include() он отрезает совпавшую часть от URL и отправляет оставшуюся часть в подключенные схемы для дальнейшей обработки.

Продолжая работу над нашим примером [11] :

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^(\d\d\d\d)/$', 'mysite.blog.views.year_detail'),
    (r'^(\d\d\d\d)/(\d\d)/$', 'mysite.blog.views.month_detail'),
)

Используя эти две схемы URL, покажем как будут обработаны тестовые запросы:

  • /weblog/2007/: В первом наборе привязок совпадёт шаблон r'^weblog/'. Так как для этого шаблона используется include(), Django отрежет совпавший текст, в данном случае это будет weblog/. Оставшаяся часть URL(т.е. 2007/) совпадёт с первым шаблоном в mysite.blog.urls.

  • /weblog//2007/: В первом наборе привязок совпадёт шаблон r'^weblog/'.Так как для этого шаблона используется include(), Django отрежет совпавший текст, в данном случае это будет weblog/. Оставшаяся часть URL (т.е./2007/, с ведущим слэшом) не совпадёт ни с одним шаблоном в mysite.blog.urls.

  • /about/: Этот запрос будет обработан представлением mysite.views.about в первом наборе привязок, показывая, что вы можете смешивать подключаемые шаблоны со встроенными.

Как совпавшие параметры работают совместно с include()

Подключенный набор привязок получает любые параметры от родительского набора, например:

# root urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^(?P<username>\w+)/blog/', include('foo.urls.blog')),
)

# foo/urls/blog.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^$', 'foo.views.blog_index'),
    (r'^archive/$', 'foo.views.blog_archive'),
)

В этом примере, захваченная переменная username передаётся в подключенный набор привязок и, следовательно, в каждую функцию представления внутри этого набора.

Следует отметить, что захваченные параметры будут всегда передаваться каждой строке подключенного набора привязок, независимо от того, принимает ли представление в этой строке такие параметры. По этой причине, эта методика полезна только в случае, когда вы уверены, что каждое представление в подключенном наборе привязок может принять передаваемые параметры.

Как работают дополнительные параметры совместно с include()

Аналогично, вы можете передавать дополнительные параметры в наборе привязок в подключаемые наборы, подобно тому, как такие параметры передаются в обычное представление — в виде словаря. Как только вы сделаете это, каждая строка подключенного набора получит эти параметры.

Например, следующие два набора привязок функционально идентичны.

Первый:

# urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^blog/', include('inner'), {'blogid': 3}),
)

# inner.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive'),
    (r'^about/$', 'mysite.views.about'),
    (r'^rss/$', 'mysite.views.rss'),
)

Второй:

# urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^blog/', include('inner')),
)

# inner.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
    (r'^about/$', 'mysite.views.about', {'blogid': 3}),
    (r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
)

Подобно случаю с захваченными параметрами (которые мы рассматривали ранее), дополнительные параметры будут всегда передаваться каждой строке подключенного набора привязок, независимо от того, может ли функция представления правильно обработать такие параметры. По этой причине, эта методика полезна только в случае, когда вы уверены, что каждое представление в подключенном наборе привязок может принять передаваемые параметры.



[11] См. предыдущий пример. Данный код подключается командой include('mysite.blog.urls').


Ищем Python программистов

Found misprint?
Select it with the mouse and hit Enter
Ctrl-Enter
Processed:
33 1 199 25


The full repository of DjangoBook translation you can get on GitHub.
We appreciate your patches!

We are glad to hear your questions, comments or suggestions!
(Open in new tab)

Users number: 601

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
ЯМ:41001223475816


© 2008-2012 Ruslan Popov @ gmail.com Powered by Django 1.2.5