Apakah lebih baik menggunakan path () atau url () di urls.py untuk django 2.0?

131

Dalam kursus online Django, instruktur meminta kami menggunakan url()fungsi untuk memanggil tampilan dan memanfaatkan ekspresi reguler dalam daftar urlpatterns. Saya telah melihat contoh lain di youtube ini. misalnya

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

Namun, dalam menjalani tutorial Django, mereka menggunakan path()sebagai contoh:

from django.urls import path
from . import views

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

Selain itu, ekspresi reguler tampaknya tidak berfungsi dengan path()fungsi karena menggunakan path(r'^$', views.index, name="index")tidak akan menemukan mysite.com/polls/tampilan.

Apakah menggunakan path()tanpa mencocokkan regex cara yang tepat untuk maju? Apakah url()lebih kuat tetapi lebih rumit sehingga mereka gunakan path()untuk memulai kita? Atau apakah ini merupakan kasus alat yang berbeda untuk pekerjaan yang berbeda?

FrostedCookies
sumber
2
Jika Anda mengikuti tutorial, saya akan menggunakan gaya mana pun yang digunakan tutorial, untuk mencegah kesalahan saat beralih di antara path()dan url(). Jika Anda ingin atau perlu menggunakan regex, maka Anda harus menggunakan re_path()atau url(). Di luar itu, saya pikir itu terserah Anda mana yang Anda pilih.
Alasdair

Jawaban:

174

Dari dokumentasi Django untuk url

url(regex, view, kwargs=None, name=None)Fungsi ini adalah alias untuk django.urls.re_path(). Ini kemungkinan akan ditinggalkan dalam rilis mendatang.

Perbedaan utama antara pathdan re_pathadalah yang pathmenggunakan rute tanpa regex

Anda dapat menggunakan re_pathuntuk panggilan regex yang kompleks dan hanya menggunakanpath untuk pencarian yang lebih sederhana

iklinac
sumber
1
Terima kasih atas info terperinci! re_pathadalah apa yang saya cari saat itu.
FrostedCookies
65

Fungsi baru ini django.urls.path()memungkinkan sintaks perutean URL yang lebih mudah dibaca. Misalnya, contoh ini dari rilis Django sebelumnya:

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

dapat ditulis sebagai:

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

The django.conf.urls.url() fungsi dari versi sebelumnya sekarang tersedia sebagai django.urls.re_path(). Lokasi lama tetap untuk kompatibilitas ke belakang, tanpa penghentian segera. Fungsi lama django.conf.urls.include()sekarang dapat diimpor dari django.urlssehingga Anda dapat menggunakan:

from django.urls import include, path, re_path

di URLconfs . Untuk membaca lebih lanjut, django doc

Sylvernus Akubo
sumber
10
Sedikit menyesatkan karena path()contoh Anda memungkinkan angka non-empat digit.
BrainCore
Yang /<int:year>/menandakan bahwa tahun harus dalam bilangan bulat, saya sarankan Anda melihat dokumentasi resmi.
Sylvernus Akubo
2
@silvablaze Seperti yang dinyatakan BrainCore, inttidak setara dengan [0-9]{4}. Apakah digunakan untuk bilangan bulat atau tidak, tidak ada hubungannya dengan hubungan ini. Mungkin jika Anda mengganti [0-9]{4}dengan [0-9]+perbandingan Anda mungkin kurang akurat, meskipun Anda mungkin masih perlu berurusan dengan jenis hasil akhir (str vs int?).
Jan Kyu Peblik
Itulah jawaban yang jelas tentang masalah ini. Terima kasih.
VikasBhat
19

pathhanya baru di Django 2.0, yang hanya dirilis beberapa minggu yang lalu. Sebagian besar tutorial tidak akan diperbarui untuk sintaks baru.

Itu tentu saja seharusnya menjadi cara yang lebih sederhana dalam melakukan sesuatu; Saya tidak akan mengatakan bahwa URL lebih kuat, Anda harus dapat mengekspresikan pola dalam format apa pun.

Daniel Roseman
sumber
9

Ekspresi reguler tampaknya tidak bekerja dengan path()fungsi dengan argumen berikut: path(r'^$', views.index, name="index").

Ini harus seperti ini: path('', views.index, name="index").

Argumen 1 harus kosong untuk memasukkan ekspresi reguler.

Syekh Denmark
sumber
2
Ya, saya pikir seperti yang ditunjukkan di atas untuk menggunakan RE Anda harus menggunakan fungsi re_path () sebagai gantinya.
FrostedCookies
2

Dari v2.0 banyak pengguna menggunakan jalur, tetapi kita bisa menggunakan jalur atau url. Sebagai contoh dalam pemetaan 2.1.1 untuk fungsi melalui url dapat dilakukan sebagai berikut

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

]

di mana posting adalah aplikasi & post_home adalah fungsi di views.py

Nani Chintha
sumber