除了customized form, Django的admin page其實也可以被customized。
要管理的項目都收納在
<app>/admin.py
裡面。
例如要管理comments,就要在
admin.py
:
from django.contrib import admin
from.models import Comment
admin.site.register(Comment)
但得出來的樣子是這樣:
1.
[@property]
要把主題,內容,author,time都一一顯示出來,先到
models.py
修改
Comment Content, add
short_content
property:
from django.db import models
from django.template.defaultfilters import truncatewords
class Post(models.Model):
...
...
class Comment(models.Model):
parent_post = models.ForeignKey(Post, on_delete=models.CASCADE)
content = models.TextField()
...
...
@property
def short_content(self):
return truncatewords(self.content, 10)
因為只想在admin list顯示出部份content
2.
[Create subclass of admin.ModelAdmin]
回到
admin.py
:
from django.contrib import admin
from .models import Comment
class CommentAdmin(admin.ModelAdmin):
list_display = ('parent_post', 'short_content', 'author', 'time')
admin.site.register(Comment, CommentAdmin)
admin page就可以看到Comment變成這樣:
3.
[Adding filters]
除了顯示不同columns,還可以好像excel 一樣使用filter功能。
admin.py
:
from django.contrib import admin
from .models import Comment
class CommentAdmin(admin.ModelAdmin):
list_display = ('parent_post', 'short_content', 'author', 'time')
list_filter = ('parent_post', 'author', 'time')
admin.site.register(Comment, CommentAdmin)
這樣在頁面的右邊Filter List就有我們設定的選項。
4.
[Adding search fields]
如果項目太多還可以使用search_fields去search某些項目。
admin.py
:
from django.contrib import admin
from .models import Comment
class CommentAdmin(admin.ModelAdmin):
list_display = ('parent_post', 'short_content', 'author', 'time')
list_filter = ('parent_post', 'author', 'time')
search_fields = ('parent_post__title', 'content', 'author__username')
admin.site.register(Comment, CommentAdmin)
版面就會在左上方出現了一個search bar。

要留意這裡的parent_post變成
parent_post__title以及author變成
author__username。
在Comment model裡面,這兩個fields都是ForeignKey連接到另一object,但search_fields可以接受的search items只有CharField或TextField,如果強行search object e.g. author,Django會出現ValueError。
要解決首先要搞清楚我們是想要search甚麼,例如parent_post我們其實search Post.title,而author其實search User.username。所以變成
parent_post__title以及
author__username,使用"__"double underscores去連接相對應的CharFIeld或TextField。