ตั้งแต่เราเขียนเว็บว่า เราเขียน View ด้วยวิธีที่เรียกว่า Function based view มาตลอดครับ (คือรับ request แล้ว return เป็นหน้านั้นๆ)


แต่จริงๆแล้วถ้าเขียนไปเรื่อยๆจะรู้ว่าหน้าเว็บหลายๆเว็บจริงๆมันก็คล้ายๆกัน แล้วเราจะมาเขียนหน้าเว็บแบบเดิมๆซ้ำทำไมกัน? จริงๆแล้ว Django มีตัวช่วยอย่างนึงที่จะมีประโยชน์กับเรามากๆเลยทีเดียวครับ

มันก็คือ Class based view นั่นแหละ สำหรับบทความนี้เราจะไม่ได้โค้ดอะไรแต่จะมาอ่าน Documentation ไปพร้อมๆกันครับ เพราะฉะนั้นก็ไปที่ Documentation กันเลย

Documentation


Generic display views?

ถ้ายังจำตอนที่เราเขียน blog ได้ จะพอจำได้ครับว่าเราเขียน Function based view ของ detail view และ list view เอง แต่ Django ทำให้ทุกอย่างง่ายขึ้นเนื่องจากเราสามารถใช้ CBVs (Class based view) ทำได้ทั้งหมดใน 3–4 บรรทัดเท่านั้น Documentationfrom django.views.generic import DetailView
from .models import Blogclass BlogDetailView(DetailView):
   model = Blog

ถ้าหากเราใช้ CBVs สำหรับ DetailView เราจะพิมพ์แค่ 2 บรรทัดเท่านั้น

สำหรับการใส่ url จะต่างจาก Function Based view ตรงที่เราจะต้องใส่ .as_view() เข้าไปหลังคลาสurlpatterns = [
   url(r'^blog/(?P<pk>\d+)/$', BlogDetailView.as_view()),
]

จะเห็นว่าง่ายกว่าใช้ Function base view มากๆตรงที่เราไม่จำเป็นต้องไป query database เอง

สำหรับการที่จะอ้างถึง object ใน template ก็ใช้ keyword ว่า object ได้เลยครับ<h1>{{ object.title }}</h1>
<p>{{ object.date }}</p>
<p>{{ object.body }}</p>

สำหรับ ListView ก็ไม่ต่างกันมากfrom django.views.generic import ListView
from .models import Blogclass BlogListView(ListView):
   model = Blog

สร้าง Viewurlpatterns = [
   url(r'^blog$', BlogListView.as_view()),
]

ชี้ url<h1>Blogs</h1>
{% for blog in object_list %}
   <h1>{{ blog.title }}</h1>
   <p>{{ blog.date }}</p>
   <p>{{ blog.body }}</p>
{% empty %}
   <li>No blogs yet.</li>
{% endfor %}

สร้าง template โดยเราจะอ้างถึง Query ด้วยคำว่า object_list


นอกจากนี้ Django ยังมี CBVs ที่มีประโยชน์อีกหลายอย่างมากๆ ซึ่งสามารถหาดูได้ใน Documentation ครับ

Medium ที่ 34
ปีนี้ผมตั้งใจว่าจะเขียน Medium ให้ได้เดือนละ 4–5 Medium ครับ สิ้นปีก็จะมี 52 Medium เท่ากับจำนวนสัปดาห์ใน 1 ปีพอดี ไม่รู้จะทำได้มั้ย แต่ก็ถือเป็น Passion เล็กๆน้อยๆของผมครับ 5555
ผมเขียนบทความหลายแนวแล้วแต่ว่าอยากเขียนยังไง ถ้าอยากให้กำลังใจช่วยกด Clap ให้ซักที สองทีด้วยนะครับ :D
เจอกันบทความหน้าครับ