django模板中{{ user }}无补全是因缺乏成熟django模板lsp服务器,pyright等仅支持python/ts,不识别source.django-templates;需用djaneiro插件提供语法高亮与片段,并将逻辑抽至.py文件由pyright分析。

为什么Django模板里{{ user }}没补全、悬停空白
根本不是LSP插件没装好,是LSP客户端连的根本不是Django模板语言服务器——pyright只认source.python,typescript-language-server只认source.ts,而Django模板既不是Python也不是TS,它需要独立的语言服务器(比如django-lsp),但目前**没有成熟、维护中的Django模板LSP实现**。
常见错误现象:
- 右下角显示
LSP: pyright,但{{ request.user }}悬停无类型提示 - Ctrl+Click跳转到
user变量时失败,或跳到django.contrib.auth.models.User但不带方法列表 - 控制台报
no semantic tokens for source.django-templates或类似scope不匹配日志
实操建议:
- 放弃对Django模板语法做LSP补全——这不是配置问题,是生态缺失;用
Djaneiro插件提供语法高亮+片段即可 - 把业务逻辑尽量抽到
.py文件里(views.py、templatetags/),这些文件才能被pyright真正分析 - 若坚持要模板内推导,只能靠
pyrightconfig.json里加"include": ["**/templates/**"]并配合stub文件模拟,但维护成本远高于收益
pyright能解析Django模型但不识别request.user怎么办
这是pyright默认关闭“Django支持”的典型表现。它不读INSTALLED_APPS,也不自动加载django-stubs,纯靠类型注解和__getattr__推导,遇到request.user这种动态属性直接哑火。
实操建议:
- 项目根目录建
pyrightconfig.json,内容至少包含:{"typeCheckingMode": "basic","include": ["."],"exclude": ["venv", "__pycache__"],"venvPath": "./venv"} - 安装
django-stubs:pip install django-stubs(注意版本需匹配Django 5.x) - 在
settings.py同级加py.typed空文件,告诉pyright这个包支持类型提示 - 在视图函数开头手动标注:
from django.http import HttpRequest<br>def my_view(request: HttpRequest):<br> # 此时request.user有完整类型提示
Sublime里Ctrl+B运行manage.py报ModuleNotFoundError: No module named 'django'
不是没装Django,是Sublime启动时没继承虚拟环境的PYTHONPATH和PATH——双击图标启动的Sublime,进程环境变量里根本没有venv/bin。
实操建议:
- Mac/Linux:终端激活环境后,用
subl .启动Sublime(不是open -a Sublime\ Text) - Windows:用
venv\Scripts\subl.exe(需先软链接或复制)替代桌面快捷方式 - 新建Build System(Tools → Build System → New Build System),写死解释器路径:
{<br> "cmd": ["./venv/bin/python", "manage.py", "runserver"],<br> "working_dir": "${project_path}",<br> "selector": "source.python"<br>} - 别信“自动检测Python路径”的插件——它们读的是系统Python,不是你
venv里的
LSP: pyright右下角显示正常,但models.py里ForeignKey没跳转
Pyright本身不处理Django ORM的动态字段生成,ForeignKey在运行时才注入user_set等反向关系,静态分析无法覆盖。即使装了django-stubs,也只覆盖基础API,不模拟运行时行为。
实操建议:
- 补全依赖
django-stubs的django.db.models.fields.related模块是否被正确加载;检查控制台是否有Failed to resolve stubs - 在model定义后加类型注解显式声明反向关系:
class User(models.Model):<br> # ...<br> class Meta:<br> pass<br><br>class Profile(models.Model):<br> user = models.OneToOneField(User, on_delete=models.CASCADE)<br> # 手动补全反向关系<br> user_profile: "Profile"
- 跳转失效时,优先用Djaneiro的
goto_definition(非LSP)——它基于文本匹配,反而更可靠
真正卡住的从来不是配置步骤,而是混淆了“编辑器能力”和“框架语义”:Sublime + LSP只是管道,Django的魔力在运行时,不在静态分析里。想让{{ user.profile }}有补全,得先让profile字段出现在User类的__dict__里——这一步,任何LSP都做不到。











