web-dev-qa-db-fra.com

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

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

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 didacticiel Django, ils utilisent plutôt path(), 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 fonction path(), car l'utilisation d'une path(r'^$', views.index, name="index") ne permet pas de trouver la vue mysite.com/polls/

Est-ce que l’utilisation de path() sans expression rationnelle correspond correctement? Est-ce que url() est plus puissant mais plus compliqué alors ils utilisent path() pour commencer? Ou s'agit-il d'outils différents pour des emplois différents?

65
FrostedCookies

Dans la documentation Django pour url

url(regex, view, kwargs=None, name=None) Cette fonction est un alias de Django.urls.re_path(). Il est probable qu’il soit déconseillé dans une version future.

La différence principale entre path et re_path est que path utilise route sans regex 

Vous pouvez utiliser re_path pour les appels de regex complexes et utiliser uniquement path pour des recherches plus simples.

88
iklinac

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

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

pourrait être écrit comme:

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

La fonction Django.conf.urls.url() des versions précédentes est maintenant disponible sous la forme Django.urls.re_path() . L'ancien emplacement reste pour la compatibilité ascendante, sans dépréciation imminente. L'ancienne fonction Django.conf.urls.include() est maintenant importable à partir de Django.urls afin que vous puissiez utiliser:

from Django.urls import include, path, re_path

dans le URLconfs. Pour en savoir plus Django doc

31
silva blaze

path est tout simplement nouveau dans Django 2.0, publié il y a seulement quelques semaines. La plupart des tutoriels n'auront pas été mis à jour pour la nouvelle syntaxe.

C'était censé être une façon plus simple de faire les choses; Je ne dirais pas que l'URL est plus puissant, vous devriez pouvoir exprimer des motifs dans l'un ou l'autre format.

15
Daniel Roseman

Le chemin est une nouvelle fonctionnalité de Django 2.0 . Expliqué ici: https://docs.djangoproject.com/fr/2.0/releases/2.0/#whats-new-2-0

Ressemble à une façon plus Pythonic, et permet de ne pas utiliser une expression régulière dans les arguments que vous passez pour voir ... vous pouvez utiliser la fonction int () par exemple.

6
Denis Cottin

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

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

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

4
Danish Shaikh

À partir de la version 2.0, de nombreux utilisateurs utilisent path, mais nous pouvons utiliser soit path, soit url . Par exemple, dans Django 2.1.1 Le mappage de fonctions via 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 de views.py

0
Nani Chintha