Table of Contents

หน้านี้เป็นส่วนหนึ่งของตัวอย่างการพัฒนาโปรแกรมด้วย Django: 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<path>.*)$', '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 %}
<p>
  Available quiz(es):
</p>
<p>
  <ul>
    {% for quiz in quizes %}
      <li>{{ quiz.title }} - {{ quiz.description }}</li>
    {% endfor %}
  </ul>
</p>
{% 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:
   <ul>
     <li>Create quizes</li>
-    <li>Play quizes</li>
+    <li><a href="/list/">Play quizes</a></li>
   </ul>
 </p>
 {% 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:
   <ul>
     <li>Create quizes</li>
-    <li><a href="/list/">Play quizes</a></li>
+    <li><a href="{% url quiz.views.list %}">Play quizes</a></li>
   </ul>
 </p>
 {% endblock %}

สังเกตว่าใน template tag url เราระบุวิวฟังก์ชัน quiz.views.list แทนที่จะระบุ url ตรง ๆ ถ้าเรามีการแก้ไข url ที่ map ไปยังวิวนี้ใน urls.py การแสดงผลใน template จะแสดง url ใหม่โดยอัตโนมัติ

แสดงรายการ quiz ที่เปิดให้ใช้

เราต้องการแสดงรายการ quiz เฉพาะที่เปิดให้ใช้แล้ว ดังนั้นเวลาค้นหาเราจะใส่ filter เพิ่มเข้าไป (ดูรายละเอียดการใช้ได้จากคู่มือ 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 })