Django 2.0 için urls.py'de path () veya url () kullanmak daha mı iyi?


131

Bir django çevrimiçi kursunda, eğitmen bize url()url şablonlar listesindeki görünümleri çağırmak ve normal ifadeleri kullanmak için bu işlevi kullanmamızı ister. Youtube'da bununla ilgili başka örnekler de gördüm. Örneğin

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

Ancak, Django öğreticisini incelerken, path()bunun yerine örneğin şunları kullanırlar :

from django.urls import path
from . import views

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

Ayrıca normal ifadeler path()işlevle çalışmıyor gibi görünmektedir, çünkü a kullanmak görünümü path(r'^$', views.index, name="index")bulamayacaktır mysite.com/polls/.

path()İleriye dönük doğru şekilde normal ifade eşleşmeden kullanmak mı ? Mı url()daha güçlü ama kullandıkları böylece daha karmaşık path()bize işe başlamak için? Yoksa farklı işler için farklı araçların durumu mu?


2
Bir öğreticiyi takip ediyorsanız, path()ve url(). Normal ifadeleri kullanmak istiyorsanız veya kullanmanız gerekiyorsa, re_path()veya kullanmalısınız url(). Bunun ötesinde, hangisini seçeceğinizin gerçekten size bağlı olduğunu düşünüyorum.
Alasdair

Yanıtlar:


174

Url için Django belgelerinden

url(regex, view, kwargs=None, name=None)Bu işlevin takma adıdır django.urls.re_path(). Muhtemelen gelecekteki bir sürümde kullanımdan kaldırılacaktır.

Arasındaki temel fark pathve re_patholmasıdır pathregex olmadan kullandığı güzergah

Sen kullanabilirsiniz re_pathkarmaşık düzenli ifade aramaları için ve sadece kullanmak pathdaha basit aramalar için


1
Detaylı bilgi için teşekkürler! re_patho zaman aradığım şey.
FrostedCookies

65

Yeni django.urls.path()işlev, daha basit, daha okunaklı bir URL yönlendirme sözdizimi sağlar. Örneğin, önceki Django sürümlerinden bu örnek:

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

şu şekilde yazılabilir:

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

django.conf.urls.url() Önceki sürümlerden fonksiyonu olarak kullanıma sunulmuştur django.urls.re_path(). Eski konum, yakın zamanda kullanımdan kaldırılmadan geriye dönük uyumluluk için kalır. Eski django.conf.urls.include()işlev artık kaynağından içe aktarılabilir, django.urlsböylece şunları kullanabilirsiniz:

from django.urls import include, path, re_path

içinde URLconfs . Daha fazla okumak için django doc


10
Örneğiniz path()dört basamaklı olmayan sayılara izin verdiği için biraz yanıltıcı .
BrainCore

/<int:year>/Yıl tamsayı olmalıdır derecede, sana resmi belgelere bakmak öneririz.
Sylvernus Akubo

2
@silvablaze BrainCore'un belirttiği gibi, intile eşdeğer değildir [0-9]{4}. Tamsayılar için kullanılıp kullanılmamasının bu ilişkiyle hiçbir ilgisi yoktur. Belki de karşılaştırmanızla değiştirirseniz [0-9]{4}, [0-9]+daha az yanlış olabilir, ancak yine de nihai sonucun türü ile ilgilenmeniz gerekebilir (str vs int?).
Jan Kyu Peblik

Konuyla ilgili net ve kesin cevap bu. Teşekkürler.
VikasBhat

19

pathsadece birkaç hafta önce piyasaya sürülen Django 2.0'da sadece yenidir. Yeni söz dizimi için eğitimlerin çoğu güncellenmemiş olacaktır.

Kesinlikle işleri yapmanın daha basit bir yolu olması gerekiyordu; URL'nin daha güçlü olduğunu söyleyemem, her iki biçimde de kalıpları ifade edebilmelisiniz.


9

Düzenli ifadeler ile çalışmak görünmüyor path()şu argümanlarla fonksiyonu: path(r'^$', views.index, name="index").

Bu böyle olmalı: path('', views.index, name="index").

Normal ifade girmek için 1. bağımsız değişken boş olmalıdır.


2
Evet, yukarıda belirtildiği gibi RE'leri kullanmak için bunun yerine re_path () işlevini kullanmanız gerektiğini düşünüyorum.
FrostedCookies


2

V2.0'dan itibaren birçok kullanıcı path kullanıyor, ancak biz ya yolu ya da url'yi kullanabiliriz. Örneğin django 2.1.1'de url aracılığıyla işlevlere eşleme aşağıdaki gibi yapılabilir

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

]

burada gönderiler bir uygulama ve post_home, views.py içinde bir işlevdir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.