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。所以強烈不建議本文的做法。