上下文未传递给被覆盖的模板

Posted

技术标签:

【中文标题】上下文未传递给被覆盖的模板【英文标题】:Context not passed to overwritten templates 【发布时间】:2021-09-10 23:52:49 【问题描述】:

Django 版本 3.2.4

我正在尝试更改管理站点使用的默认 index_titlesite_headersite_title。我已经尝试了所有建议here,但登录页面拒绝使用更新后的值。实际上,所需的上下文(下面示例中的site_header)是空的(通过覆盖模板并使用here 所述的 debug 变量来确认)并且正在使用“Django 管理”的“默认”值.来自模板C:\Program Files\Python38\Lib\site-packages\django\contrib\admin\templates\admin\base_site.html的一行:

<h1 id="site-name"><a href="% url 'admin:index' %"> site_header|default:_('Django administration')  a</a></h1>

我目前在我的应用程序的admin.py 文件中覆盖了所有三个变量,并且在我登录后正在使用更新的值,但它在初始登录页面上不起作用:

admin.site.site_header = 'My Site Header'
admin.site.index_title = 'My Index Title'
admin.site.site_title = 'My Site Title'

我可以覆盖 base_site.html 模板并硬编码一个值,但我想了解为什么这是必要的,并弄清楚如何将一些上下文传递给该覆盖的模板。我已经尝试了所有覆盖here 描述的原始上下文的方法,但均无济于事。这包括拥有custom admin site 和overrides the default admin site。我还注意到在初始登录页面上没有调用 each_context 方法,但在我登录并查看管理页面后调用它。

我认为某些问题可能源于我在urls.py 中设置urlpatterns 的方式。我已将其设置为这样,因此地址栏中显示的登录 URL 对于站点的管理员和非管理员部分都是相同的。

urlpatterns = [
    path('', include('my_app.urls')),
    path('login', auth_views.LoginView.as_view(template_name='admin/login.html')),
    path('login/', auth_views.LoginView.as_view(template_name='admin/login.html')),
    path('logout', auth_views.LogoutView.as_view()),
    path('logout/', auth_views.LogoutView.as_view()),
    path('admin/login', generic_views.RedirectView.as_view(url='/admin', permanent=True, query_string=False)),
    path('admin/login/', generic_views.RedirectView.as_view(url='/admin', permanent=True, query_string=False)),
    path('admin/logout', auth_views.LogoutView.as_view()),
    path('admin/logout/', auth_views.LogoutView.as_view()),
    path('admin/', admin.site.urls)
]

我也专门使用django_auth_ldap.backend.LDAPBackend

AUTHENTICATION_BACKENDS = [
    'django_auth_ldap.backend.LDAPBackend'
]

任何指导将不胜感激。

【问题讨论】:

是否也将您的自定义管理站点设为默认管理站点? docs.djangoproject.com/en/3.2/ref/contrib/admin/… 是的,我执行了“自定义”和“覆盖”部分中的步骤。 【参考方案1】:

我通过创建以下上下文处理器解决了我的问题:

from django.contrib import admin


def global_context(request):
    """
    This is intended to be a global context processor.  Any templates rendered from views using the
    `django.template.RequestContext` context (the default context used by generic views) will have this context
    available to them.
    """

    context = 
        'index_title': admin.site.index_title,
        'site_header': admin.site.site_header,
        'site_title': admin.site.site_title
    

    return context

这与将admin.site.index_titleadmin.site.site_headeradmin.site.site_title 设置为admin.py 中的所需值相结合,使事情按预期工作。

【讨论】:

以上是关于上下文未传递给被覆盖的模板的主要内容,如果未能解决你的问题,请参考以下文章

来自上下文的 Django 数据未显示在模板中

覆盖 AllAuth 视图并将上下文数据传递给模板

全局助手正在覆盖流星车把模板中的本地上下文

在Django中将上下文从子模板传递给父模板

通过 Angular 模板传递回调函数时保留此上下文

是否未指定在未评估的上下文中实例化模板/lambda?