如何在 Django 中扩展为“base.html”模板样式

Posted

技术标签:

【中文标题】如何在 Django 中扩展为“base.html”模板样式【英文标题】:How to extend to 'base.html' template styles in Django 【发布时间】:2016-07-12 12:42:50 【问题描述】:

我在我的应用程序中使用模板。我在 base.html 中设置了网站的主要部分,这些文件始终是相同的(页眉、菜单、页脚......),在“base.html”中正确编码以及链接到它的样式(在链接中 rel="stylesheet")。

当我尝试按原样使用基本模板时,它运行良好,同时它允许我在 de % block content % 之间添加内容并显示“永久”部分(菜单、标题等) ,但上面没有样式(CSS)。我怎样才能扩展到这些样式表来加载 CSS 样式??

我们将不胜感激,谢谢。

编辑 2:这是我的 base.html 头内容:

    <head>
<meta charset="utf-8">
% load staticfiles %
<title>% block title %Index% endblock %</title>
% block style_base %
<link href="% static 'css/styles.css' %" rel="stylesheet">
% endblock %
<meta name="description" content="% block description %% endblock %">
<link href='https://fonts.googleapis.com/css?family=Roboto+Mono:400,700,300' rel='stylesheet' type='text/css'>
<script src="static/myapp/jquery.min.js" type="text/javascript"></script>
<script src="static/myapp/main.js" type="text/javascript"></script>
</head>

这适用于 base.html,它获得了正确的样式。但是,当尝试使用另一个模板在公共部分中获取相同的样式时,它不会获取样式。模板代码是这样开始的:

% extends "base.html" %
% load staticfiles %
% load i18n %
% include "base.html" %
% block title %% trans "Main index" %% endblock %
% block content1 %

它从 base.html 获取所有正确的 HTML,但没有样式。我也尝试删除“包含”标签或更改其位置,但没有结果。有什么问题?谢谢。

另外,控制台告诉我:

Not Found: /list/static/myapp/styles.css
[25/Mar/2016 01:03:03] "GET /list/static/myapp/styles.css HTTP/1.1" 404 3414

当我刷新页面(列表是我想从基础获取样式的模板的页面)时,它一直告诉我这一点。 List 不是我项目中的目录,但是 /static/myapp/styles.css 路径是正确的。会发生什么?

【问题讨论】:

你能显示你的基本模板吗? 我已经编辑了帖子。谢谢 您可以查看静态文件的 url。虽然 'localhost/static/css' 有效。 'localhost/something/static/css' 不会。 我不知道我是否正确理解了您的答案,但我已经更改并为 css 文件创建了一个名为“css”的目录,并更改了 base.html 中的 URL。它运行良好,但另一个模板(扩展 base.html)仍然没有获得样式。谢谢 【参考方案1】:

您必须在 base.html 中调用 CSS 文件,因此当您在其他页面中扩展 base.hml 时,将调用 CSS。

对我来说,我通常这样做:

我有 Head.html 我在其中调用我在网站中使用的所有 Javascript 和 CSS 文件,如下所示:

对于 CSS:

<link rel="stylesheet" type="text/css" href="/static/styles/example.css"/>

对于 javascript:

<script type="text/javascript" src="/static/js/example.js"></script>

然后,在网站的每个页面中,在标题标签之后,我将这个 Head.html 包含在内:

% include "Head.html" %

当您在每个页面中执行此操作时,CSS 和 javascripts 文件将在所有页面中显示并可调用。

另外,主urls.py文件应该是这样的:“答案来自here”

urlpatterns = [ # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

【讨论】:

是的,但我应该怎么做呢?我应该将代码与扩展 base.html 的所有其他模板中的“扩展 base.html”分开吗?在 base.html 中调用 CSS 文件的代码是什么?找不到。。谢谢。 感谢您的回答。但是,当我尝试它时,输出仍然显示没有样式的纯文本。我试图链接头部的模板看起来像: % extends 'base.html' % % load i18n % % load staticfiles % % block title %% trans "Title" %% endblock % % include "base.html" % 应该这样吗? 对我来说,我会在 base.html 中调用 % load staticfiles %。其他可能性是答案中的新行,您也可以检查它。 再次感谢您的回答,但我尝试过但没有成功。我已经用更多信息编辑了第一篇文章。谢谢【参考方案2】:

在您的 html 文件顶部添加以下内容:

% extends "base.html" %

【讨论】:

您指的是哪个 html 文件?它位于我想与“base.html”链接的模板之上。它运行良好,它确实扩展到 base.html 上的 html 代码(这很棒),但它没有选择我想要的样式。对此有任何想法吗?谢谢 我的意思是在你的模板中。但是你应该在 style_base 标签中定义你的样式。在你的 base.html 中这样写你的样式: % block style_base % % endblock % 再次感谢您的回答。我已经更改并添加了这个模板标记系统来定义 base.html 中的样式,它适用于 base.html(它仍然具有样式)。然而,在我想扩展的模板中,它仍然缺少加载样式。我用我想要链接到 base.html 的模板的第一行代码编辑了第一篇文章,希望我能找出问题所在......再次感谢您。【参考方案3】:

应该可以了,可能是css路径不对,或者尝试删除你的%block style_base%

【讨论】:

但是如果样式在'base.html'中运行良好,路径不会错吧?我不知道还能尝试什么,它不起作用...谢谢您的回答。 我只是再试一次,但控制台仍然一次又一次地显示相同的消息...为什么? STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在你的 settings.py 文件中,你有这样的这些行吗? 看看这里:***.com/questions/24238496/…

以上是关于如何在 Django 中扩展为“base.html”模板样式的主要内容,如果未能解决你的问题,请参考以下文章

Django:在一个 html 中使用多个 CSS 文件

Django - 如何在 base.html 中传递上下文?

如何在 Django 的 base.html 中插入多个块?

如何将样式添加到 base.html:Django 框架?

如何在html文件中加载css文件已经在django中扩展了另一个html文件(base.html)

Django:在 django admin 中扩展 base.html