iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
1
Modern Web

From Django 1.11 to Django 2.1 系列 第 12

Day12 : Models & Admin (3)

默默地 Models & Admin 就邁入第三篇了,因為Django提供了許多方法來修改Admin的介面,實在是無法一個一個拿出來討論

我就拿幾個出來跟大家分享,分別是

  1. fields
  2. search_fields
  3. ordering

那~ 讓我們開始吧!


為了能夠讓上面的方法有更顯著的效果,我在 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可以修改了
https://ithelp.ithome.com.tw/upload/images/20181012/20111829WdPCc5Yu0E.jpg

順道一提 將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 '麵包')
如此一來,你便能夠搜尋到與麵包相關的結果
https://ithelp.ithome.com.tw/upload/images/20181012/201118290o8I2b0gc2.jpg

在這裡因為搜尋的是中文,所以 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',) # 價格 由小到大 排序

如此一來便能看到價格排序好的模樣
https://ithelp.ithome.com.tw/upload/images/20181012/20111829W4STBaba8Q.jpg

那如果你想要 由大到小 排序,那該怎麼做呢? 相信這難不倒大家,就是在前方加一個符號 -
也就是說

@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',) # 新增 -,資料改為 由大到小 排序

輕輕鬆鬆就能夠看到相反的結果囉!
https://ithelp.ithome.com.tw/upload/images/20181012/201118299sbm63Ertg.jpg


以上,就是今天 models & admin 第三篇,大致上就介紹這些,其他還有相當多的功能可以使用,不過其餘的部分就交給大家自行去練功囉 Django Docs

說不定等我辭窮的時候就會有個番外篇 xDD,很符合電影情節吧! 只要出個3集就一定要有一個番外篇

Anyway,明天正式回歸到 viewsurls 的部分囉! 然後接 templates 的部分! 大家敬請期待!

templates在我背後,它現在很火
templates : 什麼時候才要輪到我!!


上一篇
Day11 : Models & Admin (2)
下一篇
Day13 : path & re_path vs. url
系列文
From Django 1.11 to Django 2.1 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
wtj123
iT邦新手 5 級 ‧ 2018-11-29 12:04:39

嗨,您好:
非常詳細的Django教學,獲益良多,非常感謝!
請教一個問題:
為何 ordering = ('-price_name',)
tuple資料組內容後面一定要有一個(,) 如果不加上去,系統會出錯?

Percy iT邦新手 5 級 ‧ 2018-11-29 23:58:28 檢舉

Hi, thank u for response.

需要餵給 ordering 的值必須要為 list or tuple,而在 Python 中, 括號可被解讀為 tuple or 單純的括號,為了區別這個差異,所以當你要將某個參數設定為 tuple 型態 且 只有一個資料,後面要加上 , 告訴 Python 後方是一個 tuple,否則 ordering 就單純只是字串 'price_name'。

wtj123 iT邦新手 5 級 ‧ 2018-11-30 15:00:06 檢舉

非常謝謝您的指導!

我要留言

立即登入留言