Django3.2及以上版本模板中view.kwargs无法获取URL参数问题咨询
问题原因
{{ view.kwargs.kwarg_name }} 这个语法在Django 3.2+中并没有被移除,你用不了的核心原因是该语法仅适用于类视图(CBV),你当前用的是函数视图(FBV),本身默认不支持该调用方式。
具体细节说明:
Django 只有在使用基于类的视图时,才会自动将视图实例作为view变量注入模板上下文,该实例的kwargs属性会存储所有URL捕获的命名参数。而你现在写的是函数视图,调用render渲染模板时默认不会往上下文里传入view变量,自然无法访问到view.kwargs下的属性。
你之前能正常使用,大概率是之前的业务场景用的是类视图,或是你之前自定义了上下文处理器手动将参数注入到了全局上下文,并非版本变更导致特性被移除。
另外你提供的URL配置代码还有两处语法错误,也可能导致路由匹配异常、参数无法正常传递:
- 导入语句写法错误,正确写法是
from .views import GetSomething,而非你写的import GetSomething from .views - 路由配置列表名要求为复数
urlpatterns,你写的是单数urlpattern
解决办法
方案1:保持函数视图,手动传参(更简单)
直接把URL捕获的参数手动传入模板上下文即可,模板中无需通过view调用:
def GetSomething(request, code): return render(request, "some template here", {"code": code})
模板里直接用{{ code }}即可获取参数值。
方案2:改用类视图,保留原调用方式
如果要继续使用{{ view.kwargs.code }}的写法,把函数视图改成类视图即可:
from django.views.generic import TemplateView class GetSomething(TemplateView): template_name = "some template here"
对应修改URL配置:
from .views import GetSomething app_name = "some_app_name_here" urlpatterns = [ path("link/<int:code>/", GetSomething.as_view(), name="some_cool_name") ]
修改后原模板的{{ view.kwargs.code }}写法在Django 3.2及更高版本中都可以正常生效。
内容的提问来源于stack exchange,提问作者Jet Ezra
相关产品推荐
相关产品推荐

