vscode django提示缺失需三层面配置对齐:文件关联设为django-html、安装ms-python.django插件、pylance启用django-stubs并配置extrapaths;右下角显示html即未识别模板,models报objects错误是类型推断缺失,调试断点不触发因launch.json未用module:"django"及正确env。

VSCode 写 Django 项目缺提示,不是插件没装全,而是三个层面的配置都没对齐:文件类型识别、Python 语言服务、Django 框架语义支持。只装 ms-python.django 插件或只改解释器,90% 的提示问题依然存在。
HTML 文件不识别为 Django 模板,{{ user.name }} 全是灰色文本
VSCode 默认把所有 .html 当纯 HTML 处理,{% 和 {{ 就是普通字符,没有语法高亮、跳转、变量补全。右下角状态栏显示的是 HTML 而不是 django-html,这就是根源。
- 点击右下角
HTML标签 → 选 Configure File Association for '.html' → 输入django-html(注意不是django或html-django) - 该操作会往
.vscode/settings.json写入:"files.associations": {"*.html": "django-html"} - 但仅这样还不够——
django-html模式需要插件提供语义解析,必须安装ms-python.django(Microsoft 官方,ID 是ms-python.django),禁用其他同名旧插件(如batisteo.vscode-django) - 若想兼顾 Emmet 缩写(比如输入
div.container回车生成带 class 的 div),加这一行:"emmet.includeLanguages": {"django-html": "html"}
models.py 里 User.objects.all() 报红线:Class 'User' has no 'objects' member
这不是语法错误,是 Pylance 不知道 Django 的 Manager 是怎么挂到 Model 上的。它按标准 Python 类型推断,看不到运行时注入的 objects 属性。
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
-
pip install pylint-django没用——那是给pylint用的,Pylance 不认 - 必须让 Pylance 加载 Django 运行时类型信息:在
.vscode/settings.json中加"python.analysis.extraPaths": ["./"](确保项目根路径被扫描) - 同时确认已启用
django-stubs(推荐用pip install django-stubs安装),它提供objects、request.user等属性的类型存根 - 如果用了自定义
Manager子类,还要在pyrightconfig.json或pyproject.toml里显式 includedjango-stubs
views.py 打了断点,F5 启动后请求过来却完全不触发
断点不命中,八成不是代码问题,而是 VSCode 没走 Django 的启动流程——它把 manage.py 当普通脚本跑了,绕过了命令注册、环境变量加载和子进程控制逻辑。
-
launch.json里不能用"program": "./manage.py",必须用"module": "django" -
"args"必须含--noreload(否则 Django fork 子进程,VSCode 只调试主进程) -
"env"至少要设"DJANGO_SETTINGS_MODULE": "myproject.settings"(模块名,不是文件路径) - 还得在
.vscode/settings.json显式告诉 VSCode 项目结构:"python.django.managePyPath": "./manage.py"和"python.django.settingsModule": "myproject.settings"
最常被忽略的一点:这些配置项彼此依赖,缺一不可。比如改了 files.associations 却没装 ms-python.django,模板还是没提示;装了 django-stubs 却没配 extraPaths,Pylance 就扫不到它。调试、补全、跳转,本质都是不同插件在不同阶段读取不同配置的结果,不是“开个开关”就能全局生效。










