หน้านี้เป็นส่วนหนึ่งของตัวอย่างการพัฒนาโปรแกรมด้วย 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.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 โดยมีขั้นตอนดังนี้
เพิ่ม 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 เฉพาะที่เปิดให้ใช้แล้ว ดังนั้นเวลาค้นหาเราจะใส่ 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 })