Become a sponsor

本章汇总模块开发过程中的常见问题和解决方案。
Table 'xxx.django_example' doesn't exist 原因:模型定义后未执行数据库迁移。
解决:
# 生成迁移文件
python manage.py makemigrations example
# 执行迁移
python manage.py migrate{"code": 1, "msg": "暂无操作权限"} 原因:权限节点未配置或未分配给当前用户角色。
排查步骤:
permission_required 完全一致# 权限标识必须完全一致
permission_required = ("sys:example:page",) # 代码中
sys:example:page # 菜单管理中{"code": 1, "msg": "演示环境,暂无操作权限"} 原因:.env 中设置了 DJANGO_DEMO=True。
解决:将 .env 中的 DJANGO_DEMO 设为 False:
DJANGO_DEMO=False原因:分页参数名不匹配或字段配置错误。
排查步骤:
pageNo 和 pageSize(驼峰)is_delete=0 的记录)# 正确的参数获取方式
page_no = int(request.GET.get('pageNo', 1))
page_size = int(request.GET.get('pageSize', PAGE_SIZE))原因:error_messages 配置不完整。
解决:确保每个验证规则都配置了中文错误提示:
name = forms.CharField(
required=True,
max_length=100,
error_messages={
'required': '案例名称不能为空',
'max_length': '案例名称长度不得超过100个字符',
}
)原因:删除使用逻辑删除,查询时需要加 is_delete=False 条件。
排查步骤:
update(is_delete=True) 而非 delete()is_delete=False 条件is_delete 字段的值# 正确的逻辑删除
Example.objects.filter(id__in=id_list, is_delete=False).update(is_delete=True)
# 正确的查询
Example.objects.filter(is_delete=False)原因:save_file() 函数使用不正确。
解决:确保传入的是完整的文件 URL,并指定正确的目录名:
# 正确用法
avatar = save_file(avatar_url, "example")
# avatar_url 应该是类似 http://xxx/uploads/temp/xxx.jpg 的完整URLget_username(request) 返回空字符串 原因:JWT Token 中没有 realname 字段,或 Token 已过期。
排查步骤:
Authorization: Bearer <token>realname 字段Failed to fetch dynamically imported module 原因:路由组件路径配置错误。
排查步骤:
component 字段值正确(如 tool/example/index)component 对应(ui/src/views/tool/example/index.vue)原因:搜索表单的 submit 事件未正确绑定。
排查步骤:
BasicForm 绑定了 @submit="handleSubmit" 事件handleSubmit 中更新了 formParams 并调用了 reloadTable()_apply_filters 函数正确处理了筛选参数原因:setFormData 未正确调用或 API 返回数据格式不对。
排查步骤:
props.id 不为 0(编辑模式)getExampleDetail API 返回了正确的数据formData 的字段名与 API 返回的字段名一致原因:v-perm 权限标识与后端不一致。
排查步骤:
v-perm 中的权限字符串与后端 permission_required 完全一致TableAction 中的 auth 字段是否正确<!-- 权限标识必须与后端一致 -->
<el-button v-perm="['sys:example:add']">添加案例</el-button>原因:操作成功后未调用 reloadTable()。
解决:在弹窗的 success 事件中刷新表格:
<editDialog @success="reloadTable('noRefresh')" />原因:JWT Token 过期或未携带。
解决:
Authorization: Bearer <token>http 自动处理 Token 注入,检查是否正确引入原因:数据库或表的字符集不是 UTF-8。
解决:确保 MySQL 数据库和表使用 utf8mb4 字符集:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;DJANGO_DEMO 环境变量不生效 原因:.env 文件修改后未重启服务。
解决:修改 .env 后必须重启 Django 服务:
# 停止服务后重新启动
python manage.py runserver在 settings.py 中开启 SQL 调试:
LOGGING = {
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
},
},
}访问 http://127.0.0.1:8000/admin/,可以直接在浏览器中查看和编辑数据库数据。
如果不确定权限是否配置正确,可以用 admin 账号测试。admin(ID=1)自动跳过所有权限校验。
使用 curl 或 Postman 测试 API 接口:
# 登录获取 Token
curl -X POST http://127.0.0.1:8000/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "123456"}'
# 使用 Token 访问接口
curl -X GET http://127.0.0.1:8000/example/page?pageNo=1&pageSize=10 \
-H "Authorization: Bearer <token>"模块开发常见问题主要集中在:数据库迁移未执行、权限节点未配置、软删除过滤缺失、分页参数命名不一致、前端组件路径配置错误等。遇到问题时优先检查后端日志和网络请求,确认接口入参和返回值是否符合预期。