Django 项目基础模板

Posted

技术标签:

【中文标题】Django 项目基础模板【英文标题】:Django project base template 【发布时间】:2013-01-21 03:26:14 【问题描述】:

我可以为我的项目创建一个所有应用都可以从中提取的基本模板吗?还是我必须为每个应用程序创建一个基本模板?如果我希望它们保持相同,我会复制它们吗?

【问题讨论】:

【参考方案1】:

当然可以。 base.html 的快速示例

<!DOCTYPE html>
<html>
    <head>
        <title>My Project</title>
    </head>

    <body>
    % block content %% endblock content %
    </body>
</html>

假设您有一个名为 myapp 的应用程序,其中包含一个 view.html 页面,

% extends "base.html" %

% block content %
    <h2>Content for My App</h2>
    <p>Stuff etc etc.</p>
% endblock content %

花点时间read the docs了解更多信息

【讨论】:

许多人忽略的重要一点是% extends xxx % 可以采用字符串文字文件名(即“base.html”)解析为文件名。我们在开发过程中使用它并即时更改% extends base_template % 的值。所有主要模板(列表、详细信息、平面文件等)都使用非常通用/语义标记,以及所有 CSS/等。在每个主题的基本文件中定义。例如。 themes/blue.htmlthemes/neon.html. 我不太清楚这些文件必须放在哪里。我希望我的基本模板位于 PROJECT_ROOT/templates/base.html 中,因此它适用于所有应用程序。但是现在我该如何引用它,因为“扩展”语句在 PROJECT_ROOT/app-name/templates/... 中查找模板? @jlh:当我将模板放入 PROJECT_ROOT/project-name/templates/base.html 时,它对我有用 @jih 你可以告诉 Django 通过编辑settings.py 文件来查看PROJECT_ROOT/some_app/templates - 例如:'DIRS': [os.path.join(BASE_DIR, "some_app", "templates")]【参考方案2】:

是的,您绝对可以这样做。通过在 Django 模板中使用 extendsinclude 模板标签。

我开始学习 Django 并且最近发现了这一点。我的代码位于Github,如果您有兴趣了解我如何构造 Django 模板以从 base.html 继承,然后是 include 常见的东西,例如导航栏和页眉、页脚等。

【讨论】:

【参考方案3】:

最后一个答案有问题,这里是正确的; 你必须有这样的 Base.html:

% load staticfiles %

<!DOCTYPE html>
<html>
<head>
    <title>My Project</title>
</head>
<body>
% block content %% endblock %
</body>
</html>

也适用于 index.html

% extends "appname/base.html" %
% block content %
     <h1>test</h1>
% endblock %

【讨论】:

轻微错字 - 应该是 % extends "appname/base.html" % 而不是 % extend "appname/base.html" %【参考方案4】:

是的,您可以为您的项目创建一个其他应用程序将扩展的基本模板。检查@Kenny_Shen 的答案。

如果您担心应用隔离,只想添加两个注释。

    如果您不希望您的应用依赖“base.html”命名约定,您可以使用变量注入实际名称,详情请查看:How do I use Django's template extends variable?,

    您可能希望将应用模板块命名为其他名称,而不是“内容”,以避免与其他应用发生冲突。

【讨论】:

【参考方案5】:

对于 Django 版本 3

这里的一些答案是正确的,但它们并没有告诉您将文件放在目录结构中的什么位置。所以我将稍微解释一下答案。


是的,您可以使用% extends "base.html" % 扩展项目目录中的base.html 文件。重要的是要注意放置 base.html 文件的位置。

    打开project_name/project_name/settings.py并找到TEMPLATES数组并将'DIRS' : []更新为'DIRS': [os.path.join(BASE_DIR, 'templates')] 在根级别创建一个名为templates 的目录。此文件夹的位置为project_name/templatesprojects_name/templates 中放置您希望从所有应用程序访问的所有模板。 文件:project_name/templates/base.html

    使用% extends "base.html" %从任何特定于应用程序的模板扩展此基础文件,该模板可能位于project_name/app_name/templates/app_name/template_file.html

    % extends "base.html" %
    
    % block content %
        <h2>Content for My App</h2>
        <p>Stuff etc etc.</p>
    % endblock content %
    

此外,您还可以通过将project_name/project_name/settings.py 中的STATICFILES_DIRS 更新为STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")],在模板目录的同一级别创建项目范围的static 目录。


最终的目录结构看起来像 -

project_name/
    app_name/
        templates/
            app_name/
                template_file.html

    project_name/
        settings.py

    templates/
        base.html

    static/
        css/
        js/
        img/

【讨论】:

以上是关于Django 项目基础模板的主要内容,如果未能解决你的问题,请参考以下文章

59 Django基础三件套 , 模板{{}}语言 , 程序连mysql Django项目app Django中ORM的使用

Django项目settings.py文件基础配置

Django基础4----Template模板之模板变量

Django-模板

Python基础之 Django模板

django - 将标头从管理员复制到所有模板