在使用Django Admin后台時,有時候想自定義某一字段的Choice_field,例如屏蔽某些選項,只顯示某些指定的選項。
想象這樣的應用場景,我有一個網站,導航欄是這樣的:
點開“技術雜談”后,顯示成這樣:
在這里,我在后台設計model時,將“技術雜談”這種顯示在導航欄的分類定義成一級分類,將“C/C++”、“Python”這種隱藏在折疊欄中的分類定義成二級分類,二級分類有一個字段存儲有鏈接到對應的父分類的id號。
但這里出現了一個問題,我在后台創建文章時分類選項卡中顯示成了這樣:
一級分類和二級分類混雜到了一起,而我實際上只希望它顯示二級分類。因為當選擇“C/C++”、“python”這些二級分類時,會自動歸類到對應的一級分類之中,所以沒必要在選項卡里顯示一級分類。
……
那么問題來了,如何在文章的分類選項卡中屏蔽掉一級分類呢?
我們需要修改文章的Model類,使用 ForeignKey.
limit_choices_to
限制分類顯示的內容,只顯示符合條件的選項。
舉個簡單的例子,首先創建一個文章類:
class Article(models.Model): title = models.CharField(max_length=50,verbose_name='文章標題') content = models.TextField(verbose_name='文章內容') category = models.ForeignKey(Category,blank=True,null=True,verbose_name='分類')
可以看出,category字段導入了外鍵Category。我們在ForeignKey函數中設置limit_choices_to參數:
class Article(models.Model): title = models.CharField(max_length=50,verbose_name='文章標題') content = models.TextField(verbose_name='文章內容') category = models.ForeignKey(Category,blank=True,null=True,verbose_name='分類',limit_choices_to={'level':2})
limit_choices_to={'level':2}的意思是只顯示分類等級為2的條目,即只顯示二級分類。'level'是我在Category中定義的字段,用來代表該分類的等級,一般只有一級和二級。
總的來說,limit_choices_to的作用是設置篩選條件,在admin中只顯示篩選后的內容。
設置好這個參數,Django在后台就知道你要選擇顯示的內容了。
如此,在后台創建文章時就會發現分類表單中只有兩個選項。
你也可以根據你的需要,顯示你想要顯示的選項。當然對其它字段自定義Choice_field也是一樣的道理。
ps:一開始使用了choices參數設置顯示內容,賦給它一個存儲顯示內容的元組,但是元組內容一直提示錯誤,遂查了不少資料,終於在官方文檔里找到外鍵中limit_choices_to的使用方法。
附上ForeignKey.
limit_choices_to
官方文檔
鏈接:ForeignKey.
limit_choices_to
發現Django的中文資料不多呀,官方文檔倒是寫得很詳盡,但是英文文檔找起東西來實在費勁。在這里記錄下這個問題,以免后人再走彎路。