一个在IT行业摸爬打滚的程序猿

0%

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不给你报错,而显示是正常导入的模块==
报错代码:
1
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这个参数,这个参数表名,如果主键的数据删除了,那么外键的数据应该怎么办,这时候可以考虑是否级联删除或者设置为空字段等等,需要具体情况具体分析

1
2
# 增加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
    adminx里面未注册course

  3. 将adminx代码里面的注释去掉之后,即可注册course app
    将adminx里面的注释去掉之后,即可注册course app

  4. 修改注册的COURSE这个app显示的名字

增加verbose_name即可修改默认显示的app名字

重启django、Ctrl+F5刷新即可看到效果:
更改之后结果图

0x08、如何修改添加某个city之后,提示的描述符不为“xxx object”的情况

object提示符

  1. 代码实现,在对应的model里面,重新定义返回的def __str__(self):return self.name这个方法,指定返回是name字段
    代码实现

  2. 修改之后结果:
    显示指定的字段——city name

0x09、如何指定显示、搜索、过滤、编辑指定的字段/列
  1. 如何显示、搜索、过滤、编辑指定的列:
    如何显示、搜索、过滤、编辑指定的列
  1. 可以通过增加下面代实现(在adminx/admin中添加):
1
2
3
4
5
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"] # 指定可以在列表那里就能修改的字段(方便修改,不用点进去也能编辑那种)

增加代码list_display

修改代码之后,结果如下:
结果指定列

再来一个玩法:

如果需要也==过滤model里面的外键==的话,是通过这样的方式来使用:

1
2
3
4
5
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字段来作过滤/搜索.

感谢认真读完这篇教程的您

先别走呗,这里有可能有你需要的系列文章:

Django踩坑记录系列