无法在 Django 上扩展 html 模板

Posted

技术标签:

【中文标题】无法在 Django 上扩展 html 模板【英文标题】:Cant extend html template on Django 【发布时间】:2017-07-16 07:16:21 【问题描述】:

我无法将一个 html 文档 (child - base_home.html) 扩展到另一个父 html 文档 - base.html 我有下一个 Django 项目结构:

Testdjango/
blog/
   migrations/
   templates/
       blog/
          base.html
          base_home.html
   __init.py__
   admin.py
   apps.py
   models.py
   tests.py
   urls.py
   views.py
db.sqlite3
manage.py

我的父模板是一个base.html,代码如下:

   <!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <title>% block title %% endblock % &ndash; Blog</title>

    <!-- Bootstrap core CSS -->
    <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.7/journal/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template
    <link href="starter-template.css" rel="stylesheet"> -->

    </head>

  <body>

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Blog</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">Home</a></li>
            <li><a href="#about">About</a></li>
            <li><a href="#contact">Contact</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

    <div class="container">
        % block content %
        % endblock %

    </div>
    <!-- Bootstrap core javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
       <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
     </body>
</html>

我的“孩子”base_home.html 有下一个代码:

% extends "blog/base.html" %
% block title %
Home
% endblock %
% block content %
Lorem bla bla
% endblock %

在页面中我看不到 base_home.html 中的任何内容

【问题讨论】:

如果你渲染base_home.html,你看到网页pgae上渲染的html内容了吗? 请展示你的观点。 我的看法:from django.http import HttpResponse, request from django.shortcuts import render # Create youcoding=utf-8r views here. def home(request): return render(request, 'blog/base.html') @karthikr,不,从 base_home.html 看不到任何东西 你能粘贴扩展错误的堆栈跟踪吗?到时候调试会很容易。我的猜测是,您没有在 settings.py 中正确给出 template_dirs 路径。 【参考方案1】:

Django 无法识别您要结束的块。你需要定义它。

% extends "blog/base.html" %
% block title %
Home
% endblock title %
% block content %
Lorem bla bla
% endblock content %

【讨论】:

没有。您不必一定endblock 中提及区块名称。它是可选的。检查docs。 @dennis-slimmers 很遗憾,它也不能正常工作【参考方案2】:

试试

% extends "base.html" %

而不是

% extends "blog/base.html" %

【讨论】:

【参考方案3】:

您可以通过两种方式扩展模板

    include ## 将 html 的特定部分包含在模板中 extends ## 将普通 html 扩展为 diff 页面

base.html

<html>
<head></head>
<body>
======
======
</body>
</html>

home.html

If base.html in any folder please mention folder name dont put slash(/) before the foldername `% extends 'foldername/base.html' %` 

% extends 'base.html' % ## you can see the base.html styles in the home.html

假设您需要包含特定的 div、表格或代码使用部分 % include 'base.html' % 如果它在文件夹中 % include 'foldername/base.html' %

【讨论】:

我从 base_home 中删除“扩展”并放入 % include "blog/base_home.html" %。现在我看到 % block content % 但看不到 % block title % (home) include 仅用于在 html 中包含特定部分,请使用 extends 所以你说我的代码好不好?但我尝试在 base_home.html 中仅使用 % extends "base.html %% extends "blog/base.html" %,但它对我不起作用。可能设置有问题?【参考方案4】:

你有类似的东西

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
        'DIRS': [
            str(ROOT_DIR.path('templates')),
        ],`...

在您的设置中?

您是否在项目设置INSTALLED_APPS 中注册了您的博客应用程序?

【讨论】:

【参考方案5】:

您的模板看起来不错,请确保您的模板设置看起来像这样,并且您已将应用添加到 INSTALLED_APPS

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': 
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        ,
    ,
]

由于base.htmlbase_home.html 在同一个目录中,因此扩展基数为,

% extends "base.html" %

【讨论】:

Django 使用模板文件夹。所以我需要写“blog/base.html”,因为目录“templates”中的目录“blog”【参考方案6】:

我想我找到了答案。在我看来,我已经返回渲染(请求,“blog/base.html”)。我把它改成返回 render(request, "blog/base_home.html") - 我有扩展的地方。现在它的工作。请告诉我,这是真的吗?

【讨论】:

以上是关于无法在 Django 上扩展 html 模板的主要内容,如果未能解决你的问题,请参考以下文章

基本模板上的 Django 表单

我们可以在 django 的单个 html 模板中扩展多个 html 吗?如果可以,那么如何?

我的 django 模板导航栏无法正常工作

Django模板扩展不调用CSS

在 django admin 中覆盖模板

无法正确扩展模板 - 父模板中缺少元素