Est-il préférable d'utiliser path () ou url () dans urls.py pour django 2.0?

131

Dans un cours en ligne django, l'instructeur nous demande d'utiliser la url()fonction pour appeler des vues et utiliser des expressions régulières dans la liste des urlpatterns. J'ai vu d'autres exemples sur YouTube de cela. par exemple

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

Cependant, en parcourant le tutoriel Django, ils utilisent à la path()place par exemple:

from django.urls import path
from . import views

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

De plus, les expressions régulières ne semblent pas fonctionner avec la path()fonction car l'utilisation de a path(r'^$', views.index, name="index")ne trouvera pas la mysite.com/polls/vue.

Est-ce que l'utilisation path()sans regex correspond à la bonne façon d'aller de l'avant? Est-ce url()plus puissant mais plus compliqué alors ils utilisent path()pour commencer? Ou s'agit-il de différents outils pour différents emplois?

GivréCookies
la source
2
Si vous suivez un didacticiel, j'utiliserais le style utilisé par le didacticiel pour éviter les erreurs lors du basculement entre path()et url(). Si vous voulez ou avez besoin d'utiliser des expressions régulières, vous devez utiliser re_path()ou url(). Au-delà de cela, je pense que c'est vraiment à vous de choisir celui que vous choisissez.
Alasdair

Réponses:

174

De la documentation Django pour l' url

url(regex, view, kwargs=None, name=None)Cette fonction est un alias de django.urls.re_path(). Il sera probablement obsolète dans une prochaine version.

La principale différence entre pathet re_pathest que pathutilise route sans regex

Vous pouvez utiliser re_pathpour des appels regex complexes et l'utiliser uniquement pathpour des recherches plus simples

Iklinac
la source
1
Merci pour les informations détaillées! re_pathest ce que je recherche alors.
FrostedCookies
65

La nouvelle django.urls.path()fonction permet une syntaxe de routage URL plus simple et plus lisible. Par exemple, cet exemple des versions précédentes de Django:

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

pourrait s'écrire:

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

La django.conf.urls.url() fonction des versions précédentes est désormais disponible en tant que django.urls.re_path(). L'ancien emplacement reste pour la compatibilité ascendante, sans dépréciation imminente. L'ancienne django.conf.urls.include()fonction est désormais importable à partir de django.urls, vous pouvez donc utiliser:

from django.urls import include, path, re_path

dans les URLconfs . Pour en savoir plus sur django doc

Sylvernus Akubo
la source
10
Un peu trompeur puisque votre path()exemple autorise les nombres non à quatre chiffres.
BrainCore
Le /<int:year>/signifie que l'année doit être en nombre entier, je vous suggère de parcourir la documentation officielle.
Sylvernus Akubo
2
@silvablaze Comme l'a dit BrainCore, intn'est pas équivalent à [0-9]{4}. Qu'il soit utilisé ou non pour les nombres entiers n'a aucune incidence sur cette relation. Peut-être que si vous remplacez [0-9]{4}par [0-9]+votre comparaison, cela pourrait être moins imprécis, même si vous devrez peut-être toujours gérer le type de résultat final (str vs int?).
Jan Kyu Peblik
C'est la réponse claire sur le sujet. Merci.
VikasBhat
19

pathest tout simplement nouveau dans Django 2.0, qui n'est sorti que depuis quelques semaines. La plupart des didacticiels n'auront pas été mis à jour pour la nouvelle syntaxe.

C'était certainement censé être une façon plus simple de faire les choses; Cependant, je ne dirais pas que l'URL est plus puissante, vous devriez pouvoir exprimer des modèles dans les deux formats.

Daniel Roseman
la source
9

Les expressions régulières ne semblent pas travailler avec la path()fonction avec les arguments suivants: path(r'^$', views.index, name="index").

Il devrait être comme ceci: path('', views.index, name="index").

Le premier argument doit être vide pour entrer une expression régulière.

Danois cheikh
la source
2
Oui, je pense que, comme indiqué ci-dessus, pour utiliser les RE, vous devez utiliser la fonction re_path () à la place.
FrostedCookies
2

Depuis la v2.0, de nombreux utilisateurs utilisent le chemin, mais nous pouvons utiliser le chemin ou l'url. Par exemple, dans django 2.1.1, le mappage vers les fonctions via l'URL peut être effectué comme suit

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

]

où posts est une application et post_home est une fonction dans views.py

Nani Chintha
la source