Trong phần này chúng ta sẽ tùy chỉnh lại hệ thống Admin đã được trình bày trong bài Hệ thống Admin.
Tùy chỉnh form
Khi chúng ta đăng ký các lớp model Question
và Choice
bằng hàm admin.site.register()
, Django sẽ dựa vào các thuộc tính mà chúng ta khai báo trong các lớp đó để hiển thị form trên trang admin. Chúng ta có thể quy định Django chỉ chọn một số thuộc tính được phép hiện ra để chỉnh sửa, thay vì hiện ra hết, bởi vì khi làm một ứng dụng có sử dụng CSDL, có những thuộc tính mà bạn muốn máy tính tự động sinh ra chứ không phải do con người nhập vào, chẳng hạn như ID, ngày giờ…
Chúng ta sẽ thay đổi bằng cách sửa lại code trong file polls/admin.py
.
from django.contrib import admin # Register your models here. from .models import Question, Choice class QuestionAdmin(admin.ModelAdmin): fields = ['pub_date', 'question_text'] admin.site.register(Question, QuestionAdmin) admin.site.register(Choice)
Việc này làm rất đơn giản, chúng ta chỉ cần viết một lớp kế thừa từ lớp admin.ModelAdmin
, ở đây mình đặt tên là QuestionAdmin
, sau đó khai báo list có tên là fields
có các item là tên các thuộc tính trong model mà chúng ta muốn hiện ra trong trang Admin, sau đó truyền lớp này vào hàm admin.site.register()
.
Có thể bạn không nhận ra sự thay đổi vì chúng ta trước sau cũng cho hiện ra có 2 thuộc tính, nhưng thực ra khi bạn để Django tự động cho hiện ra hết thì nó sẽ hiển thị các thuộc tính theo thứ tự mà chúng ta khai báo trong file models.py
, còn ở đây Django hiển thị theo thứ tự mà chúng ta khai báo trong biến fields
.
Ngoài ra Django còn cho phép gom nhóm các thuộc tính lại với nhau để hiển thị.
from django.contrib import admin # Register your models here. from .models import Question, Choice class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Question, QuestionAdmin) admin.site.register(Choice)
Chúng ta khai báo các biến fields
bên trong biến fieldsets
để gom nhóm các thuộc tính lại với nhau. Mỗi nhóm đều có thể có tiêu đề hoặc không có.
Tùy chỉnh model chứa khóa ngoại
Tùy chỉnh trang chỉnh sửa
Hiện tại thì trang chỉnh sửa lớp Question có giao diện như hình dưới.
Mặc định thì Django chỉ để hiển thị đoạn text lấy từ phương thức str()
mà chúng ta đã override trong phương thức __str__()
cho từng đối tượng, chúng ta có thể tùy chỉnh Django hiển thị những thuộc tính khác.
class QuestionAdmin(admin.ModelAdmin): ... list_display = ('question_text', 'pub_date')
Để làm việc này thì chúng ta chỉ cần khai báo danh sách các thuộc tính cần hiển thị ra trong thuộc tính list_display
.
Bạn thậm chí còn có thể sắp xếp các đối tượng Question
bằng cách click chuột vào thanh tiêu đề.
Ngoài ra bạn có thể thêm các ô lọc theo thuộc tính.
class QuestionAdmin(admin.ModelAdmin): ... list_filter = ['pub_date']
Chúng ta khai báo tên các thuộc tính cần lọc trong thuộc tính list_filter
.
Vì thuộc tính pub_date
là kiểu DateTime
nên Django biết cách đưa các tùy chọn vào phần lọc chẳng hạn như Any date, Today… còn đối với các thuộc tính kiểu text hay kiểu số nguyên, số thực thì dường như là không có hiệu quả mấy.
Tiếp theo, chúng ta có thể thêm ô tìm kiếm vào trang admin:
class QuestionAdmin(admin.ModelAdmin): ... search_fields = ['question_text']
Biến search_fields
sẽ hiển thị ô tìm kiếm và chỉ tìm theo thuộc tính mà chúng ta đã khai báo trong đó, bạn cũng có thể thêm các thuộc tính khác vào nhưng nên thêm ít thôi vì Django sử dụng câu truy vấn LIKE với CSDL nên thêm nhiều thuộc tính vào sẽ làm quá trình tìm kiếm chậm đi.