>> หน้านี้เป็นส่วนหนึ่งของตัวอย่างการพัฒนาโปรแกรมด้วย Django: [[:204223-52:uquiz]]
เราจะสร้างโมเดลที่เก็บ quiz โดยในขั้นแรกเราจะสร้างโมเดลที่เก็บข้อมูลพื้นฐานของ quiz เช่น ชื่อ รายละเอียดและสถานะว่าให้เล่นได้หรือไม่ เราจะเริ่มโดยใช้หน้า admin ในการสร้าง จากนั้นเราจะสร้างหน้าแสดงรายการ quiz
===== สร้างโมเดล =====
แก้แฟ้ม ''quiz/models.py'' เพิ่มคลาส ''Quiz'' ลงไปดังด้านล่าง
Available quiz(es):
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
ลองเพิ่ม Quiz ลงไปในระบบสักสองสามอัน
===== เพิ่มการแสดงผลของวัตถุในโมเดล =====
เพิ่มเมท็อด ''
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 %}
{% for quiz in quizes %}
--- 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')),
ลองเข้าไปที่
--- 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:
- Create quizes
- - Play quizes
+ - Play quizes
{% 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:
- Create quizes
- - Play quizes
+ - Play quizes
{% 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]]) โดยเราจะระบุเงื่อนไขในการหาให้เป็น ''
--- 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 })