Czy lepiej jest użyć path () czy url () w urls.py dla django 2.0?

137

W kursie online django, instruktor url()każe nam używać funkcji do wywoływania widoków i używania wyrażeń regularnych na liście urlpatterns. Widziałem inne przykłady tego na youtube. na przykład

from django.contrib import admin
from django.urls import include
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^polls/', include('polls.urls')),
]


#and in polls/urls.py

urlpatterns = [        
    url(r'^$', views.index, name="index"),
]

Jednak przechodząc przez samouczek Django, używają path()zamiast tego np .:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index"),        
]

Ponadto wyrażenia regularne wydają się nie działać z path()funkcją, ponieważ użycie a path(r'^$', views.index, name="index")nie spowoduje znalezienia mysite.com/polls/widoku.

Czy używanie path()dopasowania bez wyrażenia regularnego jest poprawne? Czy url()jest potężniejszy, ale bardziej skomplikowany, więc używają go, path()aby nas zacząć? A może chodzi o różne narzędzia do różnych zadań?

FrostedCookies
źródło
2
Jeśli śledzisz samouczek, użyłbym dowolnego stylu, którego używa samouczek, aby uniknąć błędów podczas przełączania między path()i url(). Jeśli chcesz lub potrzebujesz użyć wyrażeń regularnych, musisz użyć re_path()lub url(). Poza tym myślę, że to naprawdę zależy od ciebie, który wybierzesz.
Alasdair

Odpowiedzi:

181

Z dokumentacji Django dla url

url(regex, view, kwargs=None, name=None)Ta funkcja jest aliasem do django.urls.re_path(). Prawdopodobnie zostanie wycofane w przyszłej wersji.

Kluczowa różnica między pathi re_pathpolega na tym, że pathużywa trasy bez wyrażenia regularnego

Można go używać re_pathdo złożonych wywołań wyrażeń regularnych i używać tylko pathdo prostszego wyszukiwania

iklinac
źródło
1
Dzięki za szczegółowe informacje! re_pathjest tym czego szukam.
FrostedCookies
71

Nowa django.urls.path()funkcja pozwala na prostszą, bardziej czytelną składnię routingu adresów URL. Na przykład ten przykład z poprzednich wydań Django:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)

można zapisać jako:

path('articles/<int:year>/', views.year_archive)

django.conf.urls.url() Funkcji z poprzednich wersji jest już dostępna django.urls.re_path(). Stara lokalizacja zachowuje zgodność z poprzednimi wersjami, bez rychłego wycofania. Starą django.conf.urls.include()funkcję można teraz zaimportować z, django.urlswięc możesz użyć:

from django.urls import include, path, re_path

w pliku URLconfs . Więcej informacji na temat django doc

Sylvernus Akubo
źródło
11
Trochę mylące, ponieważ Twój path()przykład dopuszcza liczby inne niż czterocyfrowe.
BrainCore
Te /<int:year>/oznacza, że rok powinien być w całkowitej, proponuję spojrzeć za pośrednictwem oficjalnej dokumentacji.
Sylvernus Akubo
2
@silvablaze Jak stwierdził BrainCore, intnie jest odpowiednikiem [0-9]{4}. To, czy jest używany do liczb całkowitych, czy nie, nie ma wpływu na tę zależność. Być może zastąpienie [0-9]{4}przez [0-9]+porównanie może być mniej niedokładne, chociaż nadal możesz potrzebować poradzić sobie z typem wyniku końcowego (str czy int?).
Jan Kyu Peblik,
To jasna odpowiedź na ten temat. Dzięki.
VikasBhat
19

pathjest po prostu nowością w Django 2.0, które zostało wydane zaledwie kilka tygodni temu. Większość samouczków nie została zaktualizowana do nowej składni.

Z pewnością miał to być prostszy sposób robienia rzeczy; Nie powiedziałbym, że URL jest potężniejszy, powinieneś być w stanie wyrazić wzorce w każdym formacie.

Daniel Roseman
źródło
10

Wyrażenia regularne nie wydają się działać z path()funkcji z następującymi argumentami: path(r'^$', views.index, name="index").

Powinno być tak: path('', views.index, name="index").

Aby wprowadzić wyrażenie regularne, pierwszy argument musi być pusty.

Duński Shaikh
źródło
2
Tak, myślę, że jak wskazano powyżej, aby używać RE, należy zamiast tego użyć funkcji re_path ().
FrostedCookies
3

Od wersji 2.0 wielu użytkowników używa ścieżki, ale możemy użyć ścieżki lub adresu URL. Na przykład w django 2.1.1 mapowanie do funkcji poprzez adres url można wykonać w następujący sposób

from django.contrib import admin
from django.urls import path

from django.contrib.auth import login
from posts.views import post_home
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^posts/$', post_home, name='post_home'),

]

gdzie posty to aplikacja, a post_home to funkcja w views.py

Nani Chintha
źródło