django踩坑記錄(2)

0x05、由於相對/絕對路徑寫錯導致
字段 詳細描述
位置 apps.users.models.BaseModel(類)
異常描述 RuntimeError: Model class apps.courses.models.Course doesn’t declare an explicit app_label and isn’t in an application in INSTALLED_APPS.
解決方法 修改其他app的models引用其他app的model的寫法,即這個錯誤由於導入model的時候,寫錯相對/絕對路徑而引起的,最坑的是,pycharm不給你報錯,而顯示是正常導入的模塊
報錯代碼:
RuntimeError: Model class apps.courses.models.Course doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

解決方法如下:
由於導錯路徑造成的

正確解決方法:
解決導入路徑錯誤

爲什麼是這樣引用呢?
大概是因爲,你在項目的settings.py中已經install了這個users的app,所以django知道這個users的app在哪裏,所以引用的時候就不再需要帶上前綴apps.也能正確使用(可能說的不準,僅供參考,歡迎各位指正)

0x06、用於外鍵未正確設置導致的錯誤
字段 詳細描述
位置 MxOnline\apps\operations\models.py
異常描述

TypeError: init() missing 1 required positional argument: ‘on_delete’
解決方法 | 將涉及到外鍵的地方做相對應的修改,必須加上on_delete這個參數,這個參數表名,如果主鍵的數據刪除了,那麼外鍵的數據應該怎麼辦,這時候可以考慮是否級聯刪除或者設置爲空字段等等,需要具體情況具體分析

# 增加on_delete=models.CASCADE即可
user = models.ForeignKey(UserProfile, verbose_name="用戶", on_delete=models.CASCADE)
0x07、註冊apps後才能在後臺管理系統看得到,及如何修改註冊之後app的顯示名字爲中文(admin/xadmin開發的)

例如:編寫了models之後,是需要再admin/adminx裏面添加註冊APP的信息,如果不添加,就在後臺管理系統看不到的

  1. 不註冊course app
    沒有course的app

  2. 代碼adminx裏面未註冊course
    不註冊app情況

  3. 將adminx代碼裏面的註釋去掉之後,即可註冊course app
    註冊之後app顯示情況

  4. 修改註冊的COURSE這個app顯示的名字
    增加這一行即可修改默認顯示的app名字

重啓django、Ctrl+F5刷新即可看到效果:
修改COURSE app顯示名字

0x08、如何修改添加某個city之後,提示的描述符不爲“xxx object”的情況

修改添加之後顯示object的字符

  1. 代碼實現,在對應的model裏面,重新定義返回的def __str__(self):return self.name這個方法,指定返回是name字段
    去掉顯示object字符

  2. 修改之後結果:

修改之後正常顯示city的名字

0x09、如何指定顯示、搜索、過濾、編輯指定的字段/列
  1. 如何顯示、搜索、過濾、編輯指定的列:
    如何搜索指定過濾搜索指定的列

  2. 可以通過增加下面代實現(在adminx/admin中添加):

class CityAdmin(object):
    list_display = ["id", "name", "desc", "add_time"]  # 指定顯示某些列/字段
    search_fields = ["name", "desc", "add_time"]  # 指定搜索的字段/列
    list_filter = ["name", "desc", "add_time"]  # 指定可以選擇過濾的字段/列
    list_editable = ["name", "desc"]  # 指定可以在列表那裏就能修改的字段(方便修改,不用點進去也能編輯那種)

如何搜索指定過濾搜索編輯指定的列

修改代碼之後,結果如下:
指定顯示搜索過濾編輯的列

再來一個玩法:

如果需要也過濾model裏面的外鍵的話,是通過這樣的方式來使用:

class CourseAdmin(object):
    list_display = ["name", "desc", "detail", "degree", "learn_times", "students"]
    search_fields = ["name", "desc", "detail", "degree", "students"]
    list_filter = ["name", "teacher__name", "desc", "detail", "learn_times", "degree", "students"]  # 外鍵可以通過"course__name"這種添加雙下劃線,然後指定某個字段來設置過濾
    list_editable = ["degree", "desc"]

其中teacher字段就是外鍵,Django裏面設置外鍵有點像是引用整個model字段,然後使用這個model指定name字段來作過濾/搜索.

感謝認真讀完這篇教程的您

先別走唄,這裏有可能有你需要的系列文章:

1、Django踩坑記錄系列
2、或者點擊我的個人博客進行查看這系列文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章