上下文未传递到被覆盖的模板中。

13 浏览
0 Comments

上下文未传递到被覆盖的模板中。

Django版本为3.2.4。\n我试图更改管理网站使用的默认`index_title`、`site_header`和`site_title`。我尝试了所有在这里建议的方法,但登录页面拒绝使用更新后的值。实际上,所需的上下文(以下示例中的`site_header`)为空(通过覆盖模板并使用`{{ debug }}`变量进行确认,如此处所述),并且正在使用“默认”值“Django administration”。模板`C:\\Program Files\\Python38\\Lib\\site-packages\\django\\contrib\\admin\\templates\\admin\\base_site.html`中的一行代码如下:\n

{{ site_header|default:_('Django administration') }} a

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

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

\n我可以覆盖`base_site.html`模板并硬编码一个值,但我想了解为什么需要这样做,并找出如何将一些上下文传递到被覆盖的模板中。我已经尝试了所有在此处描述的覆盖原始上下文的方法,但都没有成功。这包括拥有一个自定义的管理网站,它覆盖了默认的管理网站。我还注意到初始登录页面上没有调用`each_context`方法,但在登录后并查看管理页面时会调用该方法。\n我认为问题的一部分可能源于我在`urls.py`中如何设置`urlpatterns`。我将其设置为这样,以便登录的地址栏显示在网站的管理和非管理部分中是相同的。\n

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)
]

\n我还仅使用`django_auth_ldap.backend.LDAPBackend`:\n

AUTHENTICATION_BACKENDS = [
    'django_auth_ldap.backend.LDAPBackend'
]

\n希望能得到指导。

0
0 Comments

(Context not passed to overwritten templates)这个问题的出现的原因是在使用Django的通用视图时,如果在模板中使用了自定义的context_processor,那么默认的context将不会被传递给模板。解决这个问题的方法是创建一个全局的context_processor,并将其与Django admin的设置进行结合。

首先,需要创建一个名为global_context的context_processor,并将其放置在适当的位置。这个context_processor的作用是将admin的一些设置添加到context中,以便在模板中使用。下面是一个示例的global_context的代码:

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.py文件中设置admin的相关属性,以确保它们被正确地传递给模板。下面是一个示例的admin.py的代码:

from django.contrib import admin
admin.site.index_title = "My Admin"
admin.site.site_header = "My Admin Site"
admin.site.site_title = "My Admin Site"

通过将这个global_context的context_processor与Django admin的设置结合起来,就可以解决(Context not passed to overwritten templates)的问题。这样,在使用通用视图渲染模板时,自定义的context_processor将包含admin的设置,以便在模板中使用这些设置。

0