Plik
urls.py zawiera listę mapującą URLe do konkretnych widoków korzystając z wyrażeń regularnych. "URL dispatcher" bo tak to się w pełni nazywa posiada oprócz samego mapowania inne możliwości.
Oto przykładowy URLConf:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^articles/2003/$', 'news.views.special_case_2003'),
(r'^articles/(\d{4})/$', 'news.views.year_archive'),
(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)
from django.conf.urls.defaults import * udostępnia funkcję
patterns, która przyjmuje w parametrach listy zawierające wyrażenie regularne i nazwę widoku jaki ma zostać wykonany w przypadku dopasowania żądanego URLa z jednym, z podanych tutaj. Przykładowo:
- /articles/2005/03/ dopasuje się do trzeciej reguły
- /articles/2003/ do pierwszej (a nie do drugiej, gdyż dopasowywanie zaczyna się po kolei od początku "listy")
Powyższy przykład zawiera zmienne (wyrażenia regularne) lecz nie przypisuje im konkretnych nazw. W przypadku bardziej złożonych aplikacji i URLi nazywanie wszystkich zmiennych w URLach to konieczność. Oto przykład:
urlpatterns = patterns('',
(r'^articles/2003/$', 'news.views.special_case_2003'),
(r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
)
Ogólna postać to
(?Pwyrażenie regularne) zastosowane nazwy zmiennych będą wykorzystane do przekazania zmiennych widokowi.
/articles/2005/03/ wywoła
news.views.month_archive(request, year='2005', month='03').
W powyższych przykładach wszędzie podajemy "projekt.aplikacja.views", co stanowi nadmiar literek... Możemy podać prefiks widoków:
from django.conf.urls.defaults import *
urlpatterns = patterns('projekt.aplikacja.views',
(r'^articles/(\d{4})/$', 'year_archive'),
(r'^articles/(\d{4})/(\d{2})/$', 'month_archive'),
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'article_detail'),
)
I jak przejżyście się zrobiło... masz wiele aplikacji? to żadne problem, można zrobić kilka wywołać funkcji patterns:
from django.conf.urls.defaults import *
urlpatterns = patterns('django.views.generic.date_based',
(r'^/?$', 'archive_index'),
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$','archive_month'),
)
urlpatterns += patterns('weblog.views',
(r'^tag/(?P<tag>\w+)/$', 'tag'),
)
Możliwe jest np. stworzenie plików urls.py dla wybranych aplikacji i dołączanie ich w głównym urls.py:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^weblog/', include('django_website.apps.blog.urls.blog')),
(r'^documentation/', include('django_website.apps.docs.urls.docs')),
(r'^comments/', include('django.contrib.comments.urls.comments')),
)
Do widoku można przekazać dodatkowe zmienne dodając trzeci parametr:
urlpatterns = patterns('blog.views',
(r'^/blog/(?P<year>\d{4})/$', 'year_archive', {'foo': 'bar'}),
)
Funkcjonalność ta może być bardzo przydatna, np. przy tworzeniu specjalnych linków dla generycznej aplikacji (np. ID kategorii w linku można zastąpić sztywno zdefiniowaną frazą itd.)
(?P<slug>[\w\-_]+) - dla wartości pochodzących ze slugField (liczby, litery, myślnik, podkreślenie)
(?P<liczba>(\d+)) - wartości liczbowe
- Dodane: 14.07.2008 przez riklaunim