Чи краще використовувати path () або url () в urls.py для django 2.0?


131

У онлайн-курсі джанго, інструктор використовує нам url()функцію для виклику поглядів та використання регулярних виразів у списку URL-адрес. Я бачив інші приклади цього в YouTube. напр

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

Однак, проходячи підручник з Джанго, вони використовують path()замість цього:

from django.urls import path
from . import views

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

Крім того, звичайні вирази, здається, не працюють з path()функцією, оскільки використання перегляду path(r'^$', views.index, name="index")не знайде mysite.com/polls/.

Чи використовує path()без регулярного вирівнювання відповідність правильним шляхом? Є url()більш потужним, але складнішим, тому вони використовують path()для початку нас? Або це випадок різних інструментів для різних робіт?


2
Якщо ви дотримуєтесь підручника, я б використовував той стиль, який використовує підручник, щоб запобігти помилкам при переключенні між path()і url(). Якщо ви хочете або потрібно використовувати регулярні вирази, то ви повинні використовувати re_path()або url(). Крім того, я думаю, що саме від вас залежить, кого ви обираєте.
Alasdair

Відповіді:


174

З документації Django для URL

url(regex, view, kwargs=None, name=None)Ця функція є псевдонімом django.urls.re_path(). Можливо, у майбутньому випуску буде застаріло.

Ключова відмінність між pathі в re_pathтому, що pathвикористовується маршрут без регулярного вираження

Ви можете використовувати re_pathдля складних зворотних викликів і використовувати просто pathдля простіших пошуків


1
Дякуємо за детальну інформацію! re_pathце те, що я шукаю тоді.
FrostedCookies

65

Нова django.urls.path()функція дозволяє спростити синтаксис маршрутизації URL-адрес, який можна прочитати більше. Наприклад, цей приклад з попередніх версій Django:

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

можна записати як:

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

django.conf.urls.url() Функція з попередніх версій тепер доступна django.urls.re_path(). Старе місце розташування залишається для зворотної сумісності, без неминучої застарілості. Стару django.conf.urls.include()функцію тепер можна імпортувати, django.urlsтому ви можете використовувати:

from django.urls import include, path, re_path

у URLconfs . Для подальшого читання django doc


10
Трохи оману, оскільки ваш path()приклад дозволяє не чотирицифрові числа.
BrainCore

В /<int:year>/означає , що рік повинен бути в ціле число, я пропоную вам ознайомитися з офіційною документацією.
Сільвернус Акубо

2
@silvablaze Як заявив BrainCore, intце не еквівалентно [0-9]{4}. Незалежно від того, вживається він для цілих чисел, чи ні, це ніяк не стосується цього відношення. Можливо, якщо ви замінили [0-9]{4}на [0-9]+порівняння, це може бути менш неточним, хоча вам, можливо, все ж доведеться розібратися з типом кінцевого результату (str vs int?).
Ян Кю Пеблик

Ось ясна відповідь на цю тему. Дякую.
VikasBhat

19

pathпросто новий у Django 2.0, який був випущений лише пару тижнів тому. Більшість навчальних посібників не буде оновлено для нового синтаксису.

Безумовно, це мав бути простіший спосіб робити речі; Я б не сказав, що URL-адреса є більш потужною, ви повинні мати можливість виражати шаблони в будь-якому форматі.


9

Здається, що регулярні вирази не працюють з path()функцією з такими аргументами:path(r'^$', views.index, name="index") .

Він повинен бути таким: path('', views.index, name="index") .

Перший аргумент повинен бути порожнім, щоб ввести регулярний вираз.


2
Так, я думаю, як зазначено вище, щоб використовувати RE, ви повинні використовувати функцію re_path ().
FrostedCookies

8

Шлях - це нова функція Django 2.0. Пояснено тут: https://docs.djangoproject.com/en/2.0/releases/2.0/#whats-new-2-0

Виглядайте як більш пітонічний спосіб, і дозвольте не використовувати регулярне вираження в аргументі, який ви передаєте для перегляду ... ви можете використовувати функцію int () для приклад.


2

З версії v2.0 багато користувачів використовують шлях, але ми можемо використовувати або шлях, або URL. Наприклад, в django 2.1.1 відображення функцій через url можна зробити наступним чином

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

]

де публікації - це програма, а post_home - це функція view.py

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.