>> หน้านี้เป็นส่วนหนึ่งของตัวอย่างการพัฒนาโปรแกรมด้วย Django: [[:204223-52:uquiz]] เราจะสร้างโมเดลที่เก็บ quiz โดยในขั้นแรกเราจะสร้างโมเดลที่เก็บข้อมูลพื้นฐานของ quiz เช่น ชื่อ รายละเอียดและสถานะว่าให้เล่นได้หรือไม่ เราจะเริ่มโดยใช้หน้า admin ในการสร้าง จากนั้นเราจะสร้างหน้าแสดงรายการ quiz ===== สร้างโมเดล ===== แก้แฟ้ม ''quiz/models.py'' เพิ่มคลาส ''Quiz'' ลงไปดังด้านล่าง from django.db import models class Quiz(models.Model): title = models.CharField(max_length=200) description = models.TextField() is_enabled = models.BooleanField() จากนั้นในไดเร็กทอรีของ project สั่ง python manage syncdb เพื่อสร้างตารางของโมเดลดังกล่าว ===== admin ===== ในการใช้งาน admin เราจะต้องสร้างแฟ้ม ''admin.py'' ไว้ในไดเร็กทอรีของ app เพื่อลงทะเบียนโมเดลที่ต้องการให้ admin จัดการให้ ดังด้านล่าง from django.contrib import admin from models import Quiz admin.site.register(Quiz) จากนั้นไปแก้ ''urls.py'' โดยลบ comment ออกดังด้านล่าง (แสดงด้วย diff) --- a/urls.py Mon Sep 14 07:14:06 2009 +0700 +++ b/urls.py Mon Sep 14 07:23:37 2009 +0700 @@ -2,8 +2,8 @@ from django.conf import settings # Uncomment the next two lines to enable the admin: -# from django.contrib import admin -# admin.autodiscover() +from django.contrib import admin +admin.autodiscover() urlpatterns = patterns('', (r'^$', 'quiz.views.index'), @@ -15,7 +15,7 @@ # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: - # (r'^admin/', include(admin.site.urls)), + (r'^admin/', include(admin.site.urls)), # for serving static files (r'^site_media/(?P.*)$', 'django.views.static.serve', ลองเพิ่ม Quiz ลงไปในระบบสักสองสามอัน ===== เพิ่มการแสดงผลของวัตถุในโมเดล ===== เพิ่มเมท็อด ''__unicode__'' ลงในคลาส Quiz เพื่อบอกใช้ในการแสดงผลวัตถุในหน้า admin diff -r ff7eff44be15 quiz/models.py --- a/quiz/models.py Mon Sep 14 07:24:53 2009 +0700 +++ b/quiz/models.py Mon Sep 14 07:29:10 2009 +0700 @@ -4,3 +4,6 @@ title = models.CharField(max_length=200) description = models.TextField() is_enabled = models.BooleanField() + + def __unicode__(self): + return self.title ===== หน้าแสดงรายการ quiz ===== เราจะเพิ่มหน้าสำหรับแสดงรายการ quiz โดยมีขั้นตอนดังนี้ เพิ่ม view ชื่อ ''list'' ลงใน ''quiz/views.py'' ให้ค้นหา quiz **ทั้งหมด** แล้วส่งไปแสดงด้วย template ''quiz/list.html'' (เราจะแก้ให้แสดงรายการเฉพาะ quiz ที่เปิดแล้ว (is_enabled) ในตอนท้าย) --- a/quiz/views.py Mon Sep 14 07:33:07 2009 +0700 +++ b/quiz/views.py Mon Sep 14 07:38:38 2009 +0700 @@ -1,5 +1,10 @@ from django.shortcuts import render_to_response +from models import Quiz def index(request): return render_to_response("quiz/index.html") +def list(request): + quizes = Quiz.objects.all() + return render_to_response("quiz/list.html", + { 'quizes': quizes }) เพิ่ม template ''quiz/list.html'' {% extends "base.html" %} {% block content %}

Available quiz(es):

{% endblock %}
จากนั้นไประบุ url mapping ใน urls.py --- a/urls.py Mon Sep 14 07:33:07 2009 +0700 +++ b/urls.py Mon Sep 14 07:38:38 2009 +0700 @@ -7,6 +7,7 @@ urlpatterns = patterns('', (r'^$', 'quiz.views.index'), + (r'^list/$', 'quiz.views.list'), # Example: # (r'^uquiz/', include('uquiz.foo.urls')), ลองเข้าไปที่ http://localhost:8000/list จะเห็นรายการของ quiz ที่เราได้สร้างไว้ ===== เพิ่มลิงก์จากหน้าแรก ===== เราสามารถเพิ่มลิงก์ไปยังหน้ารายการ quiz จากหน้าแรกโดยใส่ tag a ดังด้านล่าง --- a/templates/quiz/index.html Mon Sep 14 07:41:39 2009 +0700 +++ b/templates/quiz/index.html Mon Sep 14 07:42:22 2009 +0700 @@ -8,7 +8,7 @@ What you can do here:

{% endblock %}
เมื่อแก้เรียบร้อยเราก็สามารถเรียกดูรายการ quiz ได้จากหน้าแรก อย่างไรก็ตาม การระบุ url ลงไปใน template เลยนั้น อาจทำให้โปรแกรมแก้ไขยากในภายหลัง (เช่นทำให้ไม่สามารถเปลี่ยน url ได้ง่าย ๆ) เราจะหันไปใช้ template tag ''url'' ในการระบุลิงก์แทน ดังด้านล่าง --- a/templates/quiz/index.html Mon Sep 14 07:49:02 2009 +0700 +++ b/templates/quiz/index.html Mon Sep 14 07:51:00 2009 +0700 @@ -8,7 +8,7 @@ What you can do here:

{% endblock %}
สังเกตว่าใน template tag ''url'' เราระบุวิวฟังก์ชัน ''quiz.views.list'' แทนที่จะระบุ url ตรง ๆ ถ้าเรามีการแก้ไข url ที่ map ไปยังวิวนี้ใน ''urls.py'' การแสดงผลใน template จะแสดง url ใหม่โดยอัตโนมัติ ===== แสดงรายการ quiz ที่เปิดให้ใช้ ===== เราต้องการแสดงรายการ quiz เฉพาะที่เปิดให้ใช้แล้ว ดังนั้นเวลาค้นหาเราจะใส่ ''filter'' เพิ่มเข้าไป ([[http://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-specific-objects-with-filters|ดูรายละเอียดการใช้ได้จากคู่มือ Django]]) โดยเราจะระบุเงื่อนไขในการหาให้เป็น ''is_enabled=True''. --- a/quiz/views.py Mon Sep 14 08:02:52 2009 +0700 +++ b/quiz/views.py Mon Sep 14 08:04:17 2009 +0700 @@ -5,6 +5,6 @@ return render_to_response("quiz/index.html") def list(request): - quizes = Quiz.objects.all() + quizes = Quiz.objects.filter(is_enabled=True).all() return render_to_response("quiz/list.html", { 'quizes': quizes })