🔖 Day15 - Customized Django Admin

2018 - 06 - 26
🔖 Day15 - Customized Django Admin
除了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。

Comments

There is no comment yet

New Comment

Please Login to comment