Django - การแมป URL

ตอนนี้เรามีมุมมองการทำงานตามที่อธิบายไว้ในบทก่อนหน้านี้ เราต้องการเข้าถึงมุมมองนั้นผ่าน URL Django มีวิธีการแมป URL ของตัวเองและทำได้โดยการแก้ไขไฟล์ url.py โครงการของคุณ(myproject/url.py). ไฟล์ url.py มีลักษณะดังนี้ -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

เมื่อผู้ใช้ส่งคำขอหน้าเว็บบนแอปพลิเคชันของคุณตัวควบคุม Django จะเข้ามาค้นหามุมมองที่เกี่ยวข้องผ่านไฟล์ url.py จากนั้นส่งคืนการตอบกลับ HTML หรือข้อผิดพลาด 404 ไม่พบหากไม่พบ ใน url.py สิ่งที่สำคัญที่สุดคือไฟล์"urlpatterns"ทูเพิล เป็นที่ที่คุณกำหนดการจับคู่ระหว่าง URL และมุมมอง การแมปเป็นทูเพิลในรูปแบบ URL เช่น -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

บรรทัดที่ทำเครื่องหมายจะจับคู่ URL "/ home" กับมุมมอง hello ที่สร้างในไฟล์ myapp / view.py ดังที่คุณเห็นด้านบนการทำแผนที่ประกอบด้วยสามองค์ประกอบ -

  • The pattern- regexp ที่ตรงกับ URL ที่คุณต้องการแก้ไขและแมป ทุกสิ่งที่สามารถทำงานกับโมดูล 're' ของ python มีสิทธิ์สำหรับรูปแบบ (มีประโยชน์เมื่อคุณต้องการส่งผ่านพารามิเตอร์ผ่าน url)

  • The python path to the view - เหมือนกับเวลาที่คุณกำลังนำเข้าโมดูล

  • The name- ในการดำเนินการกลับ URL คุณจะต้องใช้รูปแบบ URL ที่มีชื่อดังที่ทำในตัวอย่างด้านบน เมื่อเสร็จแล้วเพียงแค่เริ่มเซิร์ฟเวอร์เพื่อเข้าถึงมุมมองของคุณผ่าน: http: //127.0.0.1/hello

การจัดระเบียบ URL ของคุณ

จนถึงตอนนี้เราได้สร้าง URL ในไฟล์“ myprojects / url.py” แล้วอย่างไรก็ตามตามที่ระบุไว้ก่อนหน้านี้เกี่ยวกับ Django และการสร้างแอปจุดที่ดีที่สุดคือสามารถนำแอปพลิเคชันกลับมาใช้ในโครงการต่างๆได้ คุณสามารถดูได้อย่างง่ายดายว่าปัญหาคืออะไรหากคุณบันทึก URL ทั้งหมดไว้ในไฟล์“ projecturl.py” แนวทางปฏิบัติที่ดีที่สุดคือการสร้าง“ url.py” ต่อแอปพลิเคชันและรวมไว้ในไฟล์ url.py โครงการหลักของเรา (เรารวม URL ของผู้ดูแลระบบสำหรับอินเทอร์เฟซผู้ดูแลระบบไว้ก่อน)

เป็นอย่างไรบ้าง?

เราจำเป็นต้องสร้างไฟล์ url.py ใน myapp โดยใช้รหัสต่อไปนี้ -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

จากนั้น myproject / url.py จะเปลี่ยนเป็นดังต่อไปนี้ -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

เราได้รวม URL ทั้งหมดจากแอปพลิเคชัน myapp home.html ที่เข้าถึงผ่าน“ / hello” ตอนนี้คือ“ / myapp / hello” ซึ่งเป็นโครงสร้างที่ดีขึ้นและเข้าใจได้มากขึ้นสำหรับเว็บแอป

สมมติว่าเรามีมุมมองอื่นใน myapp“ ตอนเช้า” และเราต้องการแมปใน myapp / url.py จากนั้นเราจะเปลี่ยน myapp / url.py เป็น -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

สิ่งนี้สามารถนำมาพิจารณาใหม่เพื่อ -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

อย่างที่คุณเห็นตอนนี้เราใช้องค์ประกอบแรกของไฟล์ urlpatternsทูเพิล สิ่งนี้จะมีประโยชน์เมื่อคุณต้องการเปลี่ยนชื่อแอปของคุณ

การส่งพารามิเตอร์ไปยังมุมมอง

ตอนนี้เรารู้วิธีแมป URL วิธีจัดระเบียบตอนนี้ให้เราดูวิธีส่งพารามิเตอร์ไปยังมุมมอง ตัวอย่างคลาสสิกคือตัวอย่างบทความ (คุณต้องการเข้าถึงบทความผ่านทาง“ / บทความ / article_id”)

การส่งผ่านพารามิเตอร์ทำได้โดยการบันทึกด้วยไฟล์ regexpในรูปแบบ URL หากเรามีมุมมองดังต่อไปนี้ใน“ myapp / view.py”

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

เราต้องการแมปใน myapp / url.py เพื่อให้เราสามารถเข้าถึงได้ผ่าน“ / myapp / article / articleId” เราต้องการสิ่งต่อไปนี้ใน“ myapp / url.py” -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

เมื่อ Django เห็น url:“ / myapp / article / 42” มันจะส่งผ่านพารามิเตอร์ '42' ไปยังมุมมอง viewArticle และในเบราว์เซอร์ของคุณคุณจะได้รับผลลัพธ์ต่อไปนี้ -

โปรดทราบว่าลำดับของพารามิเตอร์มีความสำคัญที่นี่ สมมติว่าเราต้องการรายชื่อบทความของเดือนของปีให้เพิ่มมุมมอง viewArticles view.py ของเรากลายเป็น -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

ที่สอดคล้องกัน url.py ไฟล์จะมีลักษณะดังนี้ -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

ตอนนี้เมื่อคุณไปที่“ / myapp /icles / 12/2006 /” คุณจะได้รับ 'แสดงบทความของ: 2006/12' แต่ถ้าคุณย้อนกลับพารามิเตอร์คุณจะไม่ได้ผลลัพธ์เหมือนกัน

เพื่อหลีกเลี่ยงสิ่งนั้นคุณสามารถเชื่อมโยงพารามิเตอร์ URL กับพารามิเตอร์มุมมอง สำหรับสิ่งนั้นurl.py จะกลายเป็น -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)