Django技巧:改變Admin中顯示的應用(app)名稱


Django的Admin提供了強大的功能,很多人可能會基於Admin開發自己的應用。

在Admin默認的管理界面中,Model類的顯示名稱可以通過國際化的方法來改變,其實app的名稱也可以自己指定,你甚至可將同一個應用下的Model類分配到不同的app中去分組,如下圖:

以《Django實戰》中的Model類為例,可以這樣指定Order類顯示的應用名稱:


你甚至可以將同一app下的另一個Model類:Product指定到另一個應用下面:
這里面需要注意的是,因為Product到Order的many-to-many關系是通過LineItem類關聯的,所以必須將LineItem的app_label設置成與Product的相同:否則會出現錯誤:我的應用1.product: 'orders' specifies an m2m relation through model LineItem, which has not been installed

 

也就是說,如果Order和Product都指定了ManyToMany(through)關聯,則這三個類(Order, Product, LineItem)的app_label必須相同。

 

此問題來自hbjsfeng提問,在翻看Django的源代碼時偶然發現解決辦法。不敢獨享,所以發布出來。歡迎訪問Django專欄,並互相交流,如轉載請加鏈接:http://blog.csdn.net/thinkinside/article/details/7255707

 

根據1樓的評論做一下補充:

這樣做確實不是一個好的做法,會破壞Django內部的邏輯,此時在Admin界面操作模型類會報“找不到表”的錯誤。因為Django的Model會按照[app_label]_[model_name]的格式去找數據庫表,而我們改了app_label,當然找不到。權宜的辦法是再增加一個Meta屬性:db_table。比如:

 

這樣在管理界面就可以操作了。但是如果是一開始就這樣創建Model類,在syncdb時不會創建任何數據庫表。除非你先注釋掉app_label,syncdb后再去掉注釋。

其實app_label的原本意圖是當你在標准的app/models.py之外(比如app的子模塊中)創建Model類時,通過指定app_label來告訴Django其應該屬於的app,而不是指定到一個根本不存在的app。所以強烈不建議本文的做法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM