默默地 Models & Admin 就邁入第三篇了,因為Django提供了許多方法來修改Admin的介面,實在是無法一個一個拿出來討論
我就拿幾個出來跟大家分享,分別是
那~ 讓我們開始吧!
為了能夠讓上面的方法有更顯著的效果,我在 Food 的資料庫新增了兩筆資料,資料庫如下
之前透過圖片擷取,會顯得資料太模糊,因此這裡我會透過表格方式呈現
ID | FOOD NAME| PRICE NAME| FOOD VENDOR|
---|---------- | -------------
1 | 馬芬 | 45 | Alex
2 | 烤布蕾 | 35 | Alex
3 | 羅宋 | 65 |Alex
4 | 甜甜圈 | 25 | Alex
5 | 菠蘿麵包 | 60 | Alex
Food model 提供大家做對照
class Food(models.Model):
food_name = models.CharField(max_length = 30) # 食物名稱
price_name = models.DecimalField(max_digits = 3, decimal_places=0) # 食物價錢
food_vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE) # 代表這食物是由哪一個攤販所做的
先來講 fields,它的功用是限制 Admin 可以修改的欄位,如此一來可以避免發生不必要的修改,若是食物名稱及店家再登記之後都不會再做修改了,只有價錢(物價持續上漲)會進行變動,那麼我們要加上fields = [filed_name]
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
list_display = [field.name for field in Food._meta.fields]
list_filter = (morethanfourty,)
fields = ['price_name'] # 顯示欄位
當我們點擊修改介面時,此時只剩下Price可以修改了
順道一提 將fields那欄改成 exclude=['food_name', 'food_vendor']
,執行出來的結果會跟上面的一模一樣,字面上來看其實很好理解,fields代表的是包含,exclude則是除外
接著是 search_field ,相信聰明如你也能猜到它是什麼意思,就是 搜尋 !!
設定方法為search_fields = [filed_name]
,經由設定這一個欄位,我們可以更方便找到相關的資料
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
list_display = [field.name for field in Food._meta.fields]
list_filter = (morethanfourty,)
search_fields = ('food_name','price_name') # 搜尋欄位
在上述 Django 的搜尋中,如果你搜尋麵包,那就等同於於SQL的WHERE ( food_name ILIKE '麵包' OR price_name ILIKE '麵包')
如此一來,你便能夠搜尋到與麵包相關的結果
在這裡因為搜尋的是中文,所以 ILIKE 跟 LIKE 沒什麼兩樣拉 哈哈 ^^"
ordering 是今天的重頭戲,我就不賣關子了,它就是排序的概念,通常我們可能想找最大或最小的幾筆時,這個最好用了!!
廢話不多說,我們直接對 price_name 下手,新增 ordering = [filed_name]
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
list_display = [field.name for field in Food._meta.fields]
# list_display =['id', 'food_name']
list_filter = (morethanfourty,)
search_fields = ('food_name','price_name')
ordering = ('price_name',) # 價格 由小到大 排序
如此一來便能看到價格排序好的模樣
那如果你想要 由大到小 排序,那該怎麼做呢? 相信這難不倒大家,就是在前方加一個符號 -
也就是說
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
list_display = [field.name for field in Food._meta.fields]
# list_display =['id', 'food_name']
list_filter = (morethanfourty,)
search_fields = ('food_name','price_name')
ordering = ('-price_name',) # 新增 -,資料改為 由大到小 排序
輕輕鬆鬆就能夠看到相反的結果囉!
以上,就是今天 models & admin 第三篇,大致上就介紹這些,其他還有相當多的功能可以使用,不過其餘的部分就交給大家自行去練功囉 Django Docs
說不定等我辭窮的時候就會有個番外篇 xDD,很符合電影情節吧! 只要出個3集就一定要有一個番外篇
Anyway,明天正式回歸到 views 及 urls 的部分囉! 然後接 templates 的部分! 大家敬請期待!
templates在我背後,它現在很火
templates : 什麼時候才要輪到我!!
嗨,您好:
非常詳細的Django教學,獲益良多,非常感謝!
請教一個問題:
為何 ordering = ('-price_name',)
tuple資料組內容後面一定要有一個(,) 如果不加上去,系統會出錯?
Hi, thank u for response.
需要餵給 ordering 的值必須要為 list or tuple,而在 Python 中, 括號可被解讀為 tuple or 單純的括號,為了區別這個差異,所以當你要將某個參數設定為 tuple 型態 且 只有一個資料,後面要加上 , 告訴 Python 後方是一個 tuple,否則 ordering 就單純只是字串 'price_name'。
非常謝謝您的指導!