Django3中向/accounts/login等账户模板传递extra_context不生效如何解决
问题原因
你当前的写法不生效,是因为include()的第三个参数是将键值对作为视图函数的入参传递,而非直接注入模板上下文。你传入的{'extra_context': {xxx}}相当于给所有Django内置auth视图传入了一个名为extra_context的参数,模板中如果要取值需要写{{ extra_context.home_title }},这就是你直接取对应变量为空的原因。
推荐实现方案
按优先级从高到低排列:
方案1:使用全局上下文处理器(最适配你的需求)
如果这些配置项需要在全站所有模板(包括你自己写的业务视图、auth相关视图)中使用,上下文处理器是最优解,一次配置全局生效:
- 在你的任意APP下新建
context_processors.py文件,写入如下代码:
# your_app/context_processors.py from django.conf import settings def global_config(request): return { 'home_title': settings.HOME_TITLE, 'domain': settings.HOSTNAME }
- 打开项目
settings.py,找到TEMPLATES配置项,在OPTIONS.context_processors列表中新增你写的处理器路径:
TEMPLATES = [ { # 其他配置不变 'OPTIONS': { 'context_processors': [ # 原有默认的上下文处理器保留 'your_app.context_processors.global_config', ], }, }, ]
配置完成后,所有模板中都可以直接通过{{ home_title }}、{{ domain }}取值,你原有home视图中重复传上下文的代码也可以直接删除。
方案2:单独为auth视图配置extra_context
如果你只需要给auth相关模板传这些参数,不需要全局生效,可以不直接使用include('django.contrib.auth.urls'),而是逐个声明auth视图,传入额外上下文:
# urls.py from django.contrib.auth import views as auth_views from django.conf import settings urlpatterns = [ # 按需添加你用到的所有auth相关路径 path('accounts/login/', auth_views.LoginView.as_view( extra_context={'home_title': settings.HOME_TITLE, 'domain': settings.HOSTNAME} ), name='login'), path('accounts/logout/', auth_views.LogoutView.as_view( extra_context={'home_title': settings.HOME_TITLE, 'domain': settings.HOSTNAME} ), name='logout'), path('accounts/password_reset/', auth_views.PasswordResetView.as_view( extra_context={'home_title': settings.HOME_TITLE, 'domain': settings.HOSTNAME} ), name='password_reset'), # 其他auth路径按相同格式添加即可 ]
方案3:修正原有写法(不推荐)
如果你不想大改现有代码,也可以直接修改模板中的取值方式,把{{ home_title }}改为{{ extra_context.home_title }}即可正常取值,但这种写法可读性差,不建议长期使用。
内容的提问来源于stack exchange,提问作者Soerendip
相关产品推荐
相关产品推荐

