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

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

【问题讨论】:

    标签: django templates project base


    【解决方案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 的答案。

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

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

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

      【讨论】:

        【解决方案5】:

        对于 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 %}
          



        此外,您还可以通过将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/
        

        【讨论】:

          猜你喜欢
          • 2014-06-09
          • 2011-12-22
          • 2015-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-18
          • 1970-01-01
          相关资源
          最近更新 更多