Django 项目基础模板

71

我是否可以为我的项目创建一个基础模板,所有应用程序都可以从中绘制?还是我必须为每个应用程序创建一个基础模板?如果我希望它们相同,我只需复制它们吗?

5个回答

106

当然可以,这是一个 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 %}

花一些时间来阅读文档以获取更多信息。


10
很多人容易忽略的一个重要点是,"{% extends xxx %}" 可以接受字符串字面文件名(即“base.html”)或者是解析为文件名的变量。我们在开发过程中使用它,并动态改变 "{% extends base_template %}" 的值。所有主要模板(列表、详细信息、平面文件等)都使用非常通用/语义化的标记,并且所有的 CSS/等都在每个主题的基础文件中定义。例如,"themes/blue.html" 或 "themes/neon.html"。 - Peter Rowell
17
这段话的意思是:“我不太清楚这些文件应该放在哪里。我希望我的基础模板位于PROJECT_ROOT/templates/base.html 中,以便所有应用程序都可以使用它。但现在,由于 'extend' 语句在 PROJECT_ROOT/app-name/templates/... 中查找模板,所以我该如何引用它呢?” - jlh
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Andreas
1
@jih 你可以通过编辑 settings.py 文件来告诉 Django 在 PROJECT_ROOT/some_app/templates 中查找模板 - 例如:'DIRS': [os.path.join(BASE_DIR, "some_app", "templates")] - alex

40

对于Django版本3

这里有一些正确的答案,但它们没有告诉你在目录结构中放置文件的位置。因此,我将对答案进行一些解释。



是的,您可以使用{% extends "base.html" %}来扩展项目目录中的base.html 文件。
重要的事情是要注意base.html文件应该放在哪里。

  1. 打开project_name/project_name/settings.py并找到TEMPLATES数组,然后将'DIRS' : []更新为'DIRS': [os.path.join(BASE_DIR, 'templates')]
  2. 在根目录创建一个名为templates的目录。该文件夹的位置将为project_name/templates
  3. 在此处projects_name/templates放置您想要从所有应用程序访问的所有模板。
    文件:project_name/templates/base.html
  4. 通过使用{% 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 %}
    



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


最终目录结构如下 -

project_name/
    app_name/
        templates/
            app_name/
                template_file.html

    project_name/
        settings.py

    templates/
        base.html

    static/
        css/
        js/
        img/

9
上一个答案有一些问题,这是正确的答案;你必须拥有这样的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 %}

2
有一个小错别字 - 应该是 {% extends "appname/base.html" %} 而不是 {% extend "appname/base.html" %}。 - niceguydave

7
是的,您绝对可以这样做。通过在Django模板中使用extendsinclude模板标签。
我最近开始学习Django,并发现如何实现此功能。如果您有兴趣了解如何从base.html继承Django模板,然后include常见内容(如导航栏、页眉、页脚等),请访问我的Github页面查看代码。

0

是的,你可以为你的项目创建一个基础模板,其他应用程序将会扩展它。请查看@Kenny_Shen给出的答案。

如果你担心应用程序的隔离问题,我想再补充两点。

  1. 如果你不想让你的应用程序依赖于"base.html"这个命名约定,你可以使用变量来注入实际名称,请参见:Django模板如何使用扩展变量?。了解详情。

  2. 为了避免与其他应用程序发生冲突,你可能需要将应用程序模板块命名为其他名称,而不是"content"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接