Mapowanie odnośników na widoki

Opis systemu mapowania żądań poszczególnych adresów URL na dane widoki w aplikacji Django. URL Dispatcher (urlconf) oparty jest o wyrażenia regularne.

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")

Zmienne o określonej nazwie

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').

Prefiksy Widoków

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 przejrzyściej 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'),
)

Ładowanie URLconfów

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')),
)

Przekazywanie dodatkowych zmiennych do widoków

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.)

Najczęściej używane wyrażenia regularne

(?P<slug>[\w\-_]+) - dla wartości pochodzących ze slugField (liczby, litery, myślnik, podkreślenie)
(?P<liczba>(\d+)) - wartości liczbowe
blog comments powered by Disqus

Kategorie

Strony