Writing your first Django app, part 2
จากบทความที่แล้วเป็นการทดลองใช้ API ของ Django ใน part 2 นี้จะทดลองการใช้ Web-poll application ผ่าน Django Administration ขั้นแรกเราพิมพ์ Command
python manage.py runserver
ครั้งนี้ให้ทำการเข้า URL: http://127.0.0.1:8000/admin/ จะพบกับหน้าต่างให้ล็อกอินเข้า Django Administration โดยใส่ username/password ที่ได้จากบทความที่แล้ว(superuser) กรณีที่ไม่ได้กำหนดไว้หรือลืม username/password ให้ใช้ Command ด้านล่างเพื่อสราง superuser
python manage.py createsuperuser
Enter the admin site
เมื่อล็อกอินเข้ามาจะพบกับหน้าต่างดังรูป
Make the poll app modifiable in the admin
จะเห็นว่าจะมี แต่ Auth เท่านั้นยังไม่มี app polls ซึ่งเราจะทำการเพิ่มเข้าไปโดยแก้ไขที่ polls/admin.py ตามนี้
from django.contrib import admin
from polls.models import Poll
admin.site.register(Poll)
จากนั้นลองทำการ refresh browser ของคุณดูจะได้ดังรูป
Explore the free admin functionality
ทดลองใช้งานส่วนต่างๆ ใน Django administration
|
Add poll What's up |
|
Add successfully |
|
Change poll What's up to What's time? |
|
Show history poll What's time? |
|
Show recent actions |
Customize the admin form
ต่อไปจะเป็นการทดลองปรับแต่งส่วนต่างๆ ของ admin form เริ่มจากทำการสลับตำแหน่งของ Question กับ Date published โดยแก้ไขตามดังต่อไปนี้
from django.contrib import admin
from polls.models import Poll
class PollAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question']
admin.site.register(Poll, PollAdmin)
จะพบว่าตำแหน่งของทั้งสองจะถูกสลับตำแหน่งกัน
ต่อไปจะเป็นการเซ็็ท fields ของทั้งสอง attribute โดยเพิ่ม fieldsets ของ attribute Question จะไม่มี field หัวข้อส่วน fieldsets ของ attribute pub_date จะมี field ชื่อ Date information
from django.contrib import admin
from polls.models import Poll
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Poll, PollAdmin)
จากนั้นจะทดลองการยุบตัวลงของหัวข้อ Date information เมื่อคลิกถึงแสดงรายละเอียดที่มี ด้วยการแก้ไขตามโค้ดด้านล่าง
from django.contrib import admin
from polls.models import Poll
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
Adding related objects
ที่ผ่านมาเราได้ทดลอง admin form ส่วนต่างๆ รวมทั้ง ส่วนของ poll ต่อไปเราจะเพิ่มส่วนของ choice เพื่อดูความสัมพันธ์ของทั้งสอง class นี้รูปแบบก็เหมือนกับที่ผ่านมาดังโค้ดที่เพิ่มส่วนของ choice ขึ้นมาตามด้านล่าง
from django.contrib import admin
from polls.models import Choice
admin.site.register(Choice)
ผลที่ได้คือจะมีส่วนของ choice เพิ่มเข้ามา
ต่อไปจะเป็นการทดลองการนำ choice เข้าไปไว้ในส่วนของ poll ทำใ้ห้การแก้ไขหรือเพิ่มใหม่สามารถทำได้ทั้ง choice และ poll พร้อมกันในหน้าเดียว
from django.contrib import admin
from polls.models import Choice, Poll
class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class PollAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
admin.site.register(Poll, PollAdmin)
จากรูปด้านล่างจะเห็นทั้้งสองส่วนอยู่ในหน้า Add poll
จำนวน choice ที่ขึ้นมาสามารถเพิ่มได้จาก 3 เป็น 4,5,6 ... จากการคลิกที่ Add another Choice และลบได้ที่มุมขวาของ choice ที่เพิ่มเข้ามา แต่ไม่สามารถลบ 3 choice ที่มาตั้งแต่ครั้งแรกได้
จะพบว่าปัญหาของการเพิ่ม choice แบบ stacked ทำให้เปลืองพื้นที่ของหน้าเวปมาก ดังนั้น Django จึงได้เพิ่มการรับข้อมูลแบบ tabular ทำให้เพื่อให้สะดวกต่อการใช้งานมากขึ้น โดยแก้ไขโค้ดในส่วน ChoiceInline
class ChoiceInline(admin.TabularInline):
#...
หน้าต่างของแบบ tabular
Customize the admin change list
|
หน้าตาปกติ |
มาถึงส่วนสุดท้ายของบทความนี้ จะเป็นส่วนทดลองปรับแต่ง admin change list เริ่มจากเพิ่ม list display
class PollAdmin(admin.ModelAdmin):
# ...
list_display = ('question', 'pub_date')
|
หลังจากเพิ่ม question และ pub_date |
เพิ่ม was_published_recently เข้ามาใน list display
class PollAdmin(admin.ModelAdmin):
# ...
list_display = ('question', 'pub_date', 'was_published_recently')
|
หลังจากเพิ่ม was_published_recently |
เปลี่ยนสเตตัสช่อง Was published recently ให้เป็นเครื่องหมาย
class Poll(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'hed_recently')
เพิ่ม list filter ของ pub_date
list_filter = ['pub_date']
เพิ่ม search fields ของ question
search_fields = ['question']
Reference
https://docs.djangoproject.com/en/1.6/intro/tutorial02/
ไม่มีความคิดเห็น:
แสดงความคิดเห็น