---Views, Urls---
1.เข้าไปในแก้ไขไฟล์ polls/views.py ดังนี้
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the poll index.")
2.สร้างไฟล์ที่ชื่อว่า urls.py ไว้ในโฟลเดอร์ polls จะได้เป็น polls/urls.py และเขียนข้อความในไฟล์ดังนี้
from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index')
)
3.เข้าไปแก้ไฟล์ในส่วนของ Tutorial/urls.py โดยการเพิ่ม
url(r'^polls/', include('polls.urls')),
เข้าไปในส่วนของ urlpatterns
เมื่อมีการเรียก url เป็น http://127.0.0.1:8000/polls/ ซึ่งการทำงานเริ่มต้นจะเช็ค urls ที่ไฟล์ Tutorial/urls.py ก่อนเนื่องจาก ใน Tutorial/setting.py ได้มีการตั้งค่าไว้ว่า ROOT_URLCONF = 'Tutorial.urls' นั่นเอง
ซึ่งจากข้อ 3 ที่ได้เพิ่มโค้ดเข้าไปนั้นเราได้เขียนไว้หาก urls ลิ้งค์ไปที่ polls ให้ไปเรียก polls.urls หรือก็คือ ไฟล์ polls/urls.py ในข้อ 2 นั่นเองซึ่งจะเรียกต่อไปยังไฟล์ polls/views.py ซึ่งฟังก์ชั่น index ใน polls/views.py นี้จะทำการ return ค่ากลับไปแสดงผลทาง Browser ว่า "Hello, world. You're at the poll index."
4.เพิ่มโค้ดข้างล่างนี้เข้าไปใน polls/views.py
def detail(request, poll_id):
return HttpResponse("You're looking at poll %s." % poll_id)
def results(request, poll_id):
return HttpResponse("You're looking at the results of poll %s." % poll_id)
def vote(request, poll_id):
return HttpResponse("You're voting on poll %s." % poll_id)
5.และในส่วนของ polls/urls.py ก็ให้เพิ่มโค้ดข้างล่างนี้เข้าไปใน urlpatterns
url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
จากข้อ 4 และ 5 เมื่อเราทำการเพิ่มโค้ดไปแล้วนั้น urls ของเราจะมีรูปแบบในการเข้าใช้งานเพิ่มขึ้นอีก 3 แบบคือ
1.เพิ่มเลขเข้าไปหลัง polls เช่น http://127.0.0.1:8000/polls/34 จะได้ output ดังนี้
2.เพิ่มเลขเข้าไปหลัง polls แล้วตามด้วย results เช่น http://127.0.0.1:8000/polls/34/results จะได้ output ดังนี้
3.เพิ่มเลขเข้าไปหลัง polls แล้วตามด้วย vote เช่น http://127.0.0.1:8000/polls/34/vote จะได้ output ดังนี้
โดยส่วนที่ทำให้รับค่าตัวเลขได้คือ (?P<poll_id>\d+) โดยที่ ?P<poll_id> เป็นส่วนที่เอาไว้ระบุว่าค่าที่รับนั้นไปเป็นตัวแปรไหนซึ่งในที่นี้คือ poll_id ส่วน \d+ คือ regular expressions ซึ่ง d+ หมายถึงตัวเลขกี่หลักก็ได้
Regular Expressions คือ ลำดับของตัวอักษรซึ่งเป็นรูปแบบหรือ pattern ส่วนใหญ่ใช้เช็คว่ามีรูปแบบตรงกับที่เรากำหนดหรือไม่
---Templates---
6.ในโฟลเดอร์ polls ให้เราสร้างโฟลเดอร์ใหม่ที่ชื่อ templates และในโฟลเดอร์ templates ที่สร้างใหม่ให้สร้างโฟลเดอร์ที่ชื่อ polls อีกครั้งจากนั้นให้สร้างไฟล์ index.html ไว้ภายในโดยภายในไฟล์ index.html มีโค้ดดังนี้
{% if latest_poll_list %}
<ul>
{% for poll in latest_poll_list %}
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
รูปแบบของโฟลเดอร์จะสรุปได้ดังนี้ polls > templates > polls > index.html
7.จากนั้นแก้ไข Functions index และเพิ่มการ import ของไฟล์ views.py ใน polls ดังนี้
from polls.models import Poll
def index(request):
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
context = {'latest_poll_list': latest_poll_list}
return render(request, 'polls/index.html', context)
ซึ่งรูปแบบของ template index.html นี้หากใน latest_poll_list นั้นไม่มี Poll เลยก็จะแสดงผลว่า No polls are available. ที่ Browser ของเราแต่หากมีก็จะสร้างลิ้งค์ให้ผู้ใช้สามารถกดเข้าไปดูต่อได้ซึ่งจะเป็นการลิ้งค์แบบ polls/เลข id โดยจะเรียก Functions detail ออกมาแสดงผล
ในส่วนของ views.py ที่แก้ไขนั้นได้ทำการ import Poll เข้ามาเพื่อใช้ในการเข้าถึงข้อมูลใน database ที่เก็บไว้ใน Functions index โดยตัวแปร latest_poll_list จะเป็นการสร้าง List ที่เก็บ Objects ของ Poll ไว้ 5 ตัวโดยเรียงลำดับตาม pub_date ที่มีการเพิ่มเข้ามาล่าสุดหากมีเกิน 5 ตัวก็จะนำมาแสดงเพียง 5 ตัวเท่านั้นจากนั้นในตัวแปร context มีไว้เพื่อกำหนดตัวแปร latest_poll_list ให้ตรงกับ 'latest_poll_list' ที่อยู่ใน templates index.html
จากนั้นจึง เรียกใช้คำสั่ง render(request, 'polls/index.html', context) โดย render นั้นคือการเรียกไฟล์ templates index.html มาแล้วส่งตัวแปรทั้งหมดใน context ไปแปลงเป็นโค้ด HTML จากนั้นส่งโค้ดทั้งหมด return กลับไปแสดงผล
8.เข้าไปแก้ไข polls/views.py อีกครั้งโดยแก้ไขตามนี้
from django.shortcuts import render, get_object_or_404
def detail(request, poll_id):
poll = get_object_or_404(Poll, pk=poll_id)
return render(request, 'polls/detail.html', {'poll': poll})
9.จากนั้นสร้าง template ขึ้นมาอีกอันชื่อ detail.html เก็บไว้ใน polls > templates > polls > detail.html (ที่เดียวกับที่เก็บ templates index.html) โดยภายในมีรายละเอียดดังนี้
<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
จากการแก้ไขในข้อ 9 และ 10 จะเมื่อลองเข้าไปที่ http://127.0.0.1:8000/polls/1 จะแสดงผลออกมาเป็น Choice ทั้งหมดของ polls What's up? ซึ่งคือ Poll ตัวแรกหรือ pk = 1 โดยในส่วนของ views.py จะเห็นว่ามีการ import get_object_or_404 เข้ามาซึ่ง get_object_or_404 มีไว้เพื่อให้ Functions นี้ดึง Objects จาก Poll โดยที่ pk = poll_id ที่รับค่ามาโดยหาก poll_id ที่ได้รับนั้นไม่มีอยู่ใน Poll แล้วจะเด้งไปยังหน้า Page not found 404 แทนโดยที่ทำแบบนี้เพื่อเป็นเงื่อนไขในการดักหากมีการส่งค่า poll_id ที่ไม่มีใน Poll ก็จะเป็นการบอกผู้ใช้ได้ในทันทีว่าไม่มี Objects นั้นอยู่แต่หากมีค่าก็จะได้ค่าเป็น Objects Poll กลับมาใช้ในการ render ได้เลยหากเทียบแล้วจริงๆจะพบว่า get_object_or_404 นั้นให้ผลเหมือนกัน โค้ดด้านล่างนี้
try:
poll = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
จะเห็นได้ว่าหาก มีการ get Objects แล้ว Objects นั้นไม่มีอยู่ก็จะเด้งไปหน้า Page not found 404 เช่นเดียวกับการใช้คำสั่ง get_object_or_404 เลย ซึ่งทั้ง render และ get_object_or_404 นั้นทั้งคู่เป็น API ที่ทางผู้สร้าง django สร้างไว้ให้เราเรียกใช้ได้ทันที
ในส่วนของ templates detail.html นั้นจะเป็นการแสดงผลโดยจะใช้ชื่อคำถามของ Poll เป็น Header จากนั้นจึงเข้าไปอ่านข้อมูล Choice ทั้งหมดใน Poll นั้นๆและนำมาแสดงเป็นข้อๆผ่านทาง Browser ซึ่งใช้ render ในการนำข้อมูลใส่ลงใน templates เช่นกัน
10.แก้ไขไฟล์ Tutorial/urls.py จาก
url(r'^polls/', include('polls.urls')),
ให้เป็นแบบนี้
url(r'^polls/', include('polls.urls', namespace="polls")),
11.เข้าไปแก้ไข templates index.html ของ polls โดยแก้บรรทัด
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
ให้เป็นแบบนี้
<li><a href="{% url 'polls:detail' poll.id %}">{{ poll.question }}</a></li>
ผลที่ได้จากการแก้นั้นคือการลดการใช้ Code แบบตายตัวใน templates หากในอนาคตเราเปลี่ยนรูปแบบลิ้งค์ของ detail เราก็ไม่จำเป็นที่จะต้องเข้ามาแก้ไขใน templates เองเพราะ templates เราจะเรียกรูปแบบของลิ้งค์จาก urls.py เองหรือเรียกว่าลิ้งค์แบบ Dynamic โดย polls นั้นมาจากชื่อของ namespace ใน Tutorial/urls.py และ detail นั้นมากจากชื่อของ name ใน polls/urls.py
ในส่วนของ urls.py ที่เพิ่ม namespace เข้าไปก็เพื่อลดความสับสนที่อาจเกิดขึ้นในอนาคตได้หากมี App หลายๆตัวสังเกตุได้จาก {% url 'polls:detail' poll.id %} หากเราไม่ใส่ namespace ใน url แบบแรกเราก็สามารถใช้ {% url 'detail' poll.id %} แบบนี้แทนได้ซึ่งก็ Dynamic เหมือนกันแต่อย่างที่กล่าวไว้ข้างต้นหากเรามี App มากๆเราอาจจะสับสนได้ว่า detail นี้คือของอันไหนนั่นเอง
จาก Tutorial Part 3 นี้จะเห็นได้ว่า เราสามารถใช้ templates เพื่อแก้ปัญหาในส่วนของการสร้างไฟล์ HTML เองหลายๆไฟล์ได้โดย django จะเรียก templates ที่เราเขียนไว้มา render ออกเป็น Output แสดงผลทาง Browser ให้ผู้ใช้สามารถดูได้โดยที่เราไม่ต้องเขียน HTML ของ poll ทั้งหมดเอง และนอกจากนี้ ในส่วนของ urls เรายังสามารถดึงค่าจาก urls มาใช้ใน Functions เพื่อเลือก Objects หรือรูปแบบการแสดงผลต่างๆได้
ข้อมูลเพิ่มเติมของ Regular Expressions จาก wikipedia.org
ไม่มีความคิดเห็น:
แสดงความคิดเห็น