Django 1.5:扩展 base.html 时,我的 <head> 标签显示在我孩子的 <body> 中

Posted

技术标签:

【中文标题】Django 1.5:扩展 base.html 时,我的 <head> 标签显示在我孩子的 <body> 中【英文标题】:Django 1.5: When extending base.html, my <head> tag displays in my child's <body> 【发布时间】:2014-08-11 09:56:23 【问题描述】:

编辑:添加我的基本模板和子模板的完整版本。

我正在使用 Django 1.5.8 并且有一个基本模板(在模板根目录中)和用于扩展基础的子模板的子文件夹。

当我扩展 base.html 时,基本模板的所有内容都会显示在子模板的正文中。这发生在除索引之外的所有子页面上。是否有一些我不知道的 Django 模板继承规则?

这是我的完整基础:

<!-- base.html -->

<!DOCTYPE html>

<html lang="en">

<head>
    % load ganalytics %
    % load twitter_tag %
    % load compress %
    % load tags %

    <meta charset="utf-8">
    <!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->

    <meta name="viewport" content="width=device-width, initial-scale=1">

    % block othermeta %
    <meta name="description" content="Welcome to Multimechanics">
    <title>MultiMechanics</title>
    <link rel="icon" type="image/png" href=" STATIC_URL ico/favicon.ico" />

    <!--Needed for salesforce-->
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    % endblock %

    <!-- Bootstrap core CSS -->
    <!--<link href="css/bootstrap.min.css" rel="stylesheet">-->
    % compress css %
    <link href=" STATIC_URL css/style.css" rel="stylesheet">
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
    <link href=" STATIC_URL css/animate.css" rel="stylesheet">
    <link href=" STATIC_URL css/lightbox.css" rel="stylesheet">
    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700' rel='stylesheet' type='text/css'>
    <link href='http://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700' rel='stylesheet' type='text/css'>
    % endcompress %

    % ganalytics %

    % block otherheader %% endblock %

</head>

<body>

    <!-- Navigation -->
    <header>
        <div class="navbar navbar-default navbar-fixed-top" role="navigation">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                        <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="/"><img src=" STATIC_URL img/logo.png" ></a>
                </div>
                <div class="collapse navbar-collapse">
                    % if user.is_authenticated %
                    <a href="/logout" class="navbar-btn btn btn-red pull-right hidden-sm hidden-xs">Log Out</a>
                    % else %
                    <a href="/login" class="navbar-btn btn btn-red pull-right hidden-sm hidden-xs">Log In</a>
                    % endif %
                    <ul class="nav navbar-nav navbar-right">


                        <li class='dropdown % active request "^/faqs/$" % % active request "^/multiscale/$" % % active request "^/about-us/$" %'>
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a>
                            <ul class="dropdown-menu">
                                % if request.get_full_path == "/" %
                                <li><a href="#about">Product Overview</a></li>
                                <li><a href="#features">Product Applications</a></li>
                                % else %
                                <li><a href="/">Multimech Home</a></li>
                                % endif %
                                <li><a href="/about-us">MultiMech Details</a></li>
                                <li><a href="/multiscale">What's Multiscale?</a></li>
                                <!--<li><a href="/porfolio/demos">Demos</a></li>
                                <li><a href="/portfolio/case">Case Studies</a></li>-->
                                <li><a href="/faqs">Frequent Questions</a></li>
                            </ul>
                        </li>
                        <li class='dropdown % active request "^/trueinnovation/$" % % active request "^/portfolio/$" %'>
                            <a href="/portfolio" class="dropdown-toggle" data-toggle="dropdown">Showcases <b class="caret"></b></a>
                            <ul class="dropdown-menu">
                                % if request.get_full_path == "/" %
                                <li><a href="#showcases">Featured Demos</a></li>
                                % endif %
                                <li><a href="/portfolio">Demo Gallery</a></li>
                                <li><a href="/trueinnovation">Blog</a></li>
                            </ul>
                        </li>
                        <li class='dropdown % active request "^/careers/$" % % active request "^/contact-us/$" % % active request "^/login/$" % % active request "^/help/$" % % active request "^/register/$" % % active request "^/thanks/$" %'>
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Connect<b class="caret"></b></a>
                            <ul class="dropdown-menu">
                                <li><a href="/contact-us">Contact Us</a></li>
                                <li><a href="/careers">Careers</a></li>
                                <li><a href="/help">Help</a></li>
                                <li><a href="/login">User Login</a></li>
                            </ul>
                        </li>

                        % if request.get_full_path != "/" %
                        <li class="dropdown">
                            <a href="/contact-us">Contact</a>
                        </li>
                        % else %
                        <li class="dropdown">
                            <a href="#contact">Contact</a>
                        </li>
                        % endif %


                        <!--     Navbar Search -->
                        <li class="hidden-xs" id="navbar-search">
                            <a href="#">
                                <i class="fa fa-search"></i>
                            </a>
                            <div class="hidden" id="navbar-search-box">
                                <div class="input-group">
                                    <input type="text" class="form-control" placeholder="Search">
                                    <span class="input-group-btn">
                                        <button class="btn btn-default" type="button">Go!</button>
                                    </span>
                                </div>
                            </div>
                        </li>


                    </ul>


                    <!-- Mobile Search -->
                    <form class="navbar-form navbar-right visible-xs" role="search">
                        <div class="input-group">
                            <input type="text" class="form-control" placeholder="Search">
                            <span class="input-group-btn">
                                <button class="btn btn-red" type="button">Search!</button>
                            </span>
                        </div>
                    </form>
                </div><!--/.nav-collapse -->
            </div>
        </div>
    </header>
    <!-- / .navigation -->
    % block content %
    % endblock %

    <!-- footer
    ================================================== -->
    <footer>
        <div class="container">
            <div class="row">
                <!-- Contact Us -->
                <div class="col-sm-4">
                    <h4><i class="fa fa-map-marker text-red"></i> Contact Us</h4>
                    <p>Do not hesitate to contact us if you have any questions or feature requests:</p>
                    <p>
                        Omaha, NE 68154<br />
                        14301 FNB Parkway, Suite 100<br />
                        Phone: +1 402 957 1336<br />
                        Email: <a href="mailto:sales@multimechrd.com">sales@multimechrd.com</a>
                    </p>
                </div>
                <!-- Recent Tweets -->
                % load twitter_tag cache %
                % cache 60 my_tweets %
                % get_tweets for "multimechanics" as tweets limit 2 %

                <div class="col-sm-4">
                    <h4><i class="fa fa-twitter-square text-red"></i> Recent Tweets</h4>
                    % for tweet in tweets %
                    <div class="tweet">
                        <i class="fa fa-twitter fa-2x"></i>
                        <p>
                             tweet.html|safe 

                        </p>
                    </div>
                    % endfor %

                </div>

                % endcache %
                <!-- Newsletter -->

                <div class="col-sm-4">
                    <h4><i class="fa fa-envelope text-red"></i> Newsletter</h4>
                    <p>
                        Enter your e-mail below to subscribe to our free newsletter.
                        <br>
                        We promise not to bother you often!
                    </p>
                    <!--<form class="form" role="form" method="post" action="/newsletter request.get_full_path ">-->
                    <form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">

                        <input type=hidden name="oid" value="00Di0000000fkHM">
                        <input type=hidden name="retURL" value="http://multimech2.azurewebsites.net/thanks/newsletter">
                        <input type=hidden name="lead_source" id="lead_source" value="Web">
                        <input type=hidden name="city" id="city" value="ip">


                        % csrf_token %
                        <div class="row">
                            <div class="col-sm-8">
                                <div class="input-group">
                                    <label class="sr-only" for="subscribe-email">Email address</label>
                                    <!--<input type="email" class="form-control" id="subscribe-email" placeholder="Enter your email">-->
                                    <div class="fieldWrapper"> newsletter_form.email </div>
                                    <span class="input-group-btn">
                                        <button type="submit" class="btn btn-default" name="newsletter_form">OK</button>
                                    </span>
                                </div>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </footer>

    <!-- Copyright -->
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="copyright">
                    Copyright 2014 - MultiMechanics, LLC | All Rights Reserved
                </div>
            </div>
        </div>  <!-- / .row -->
    </div> <!-- / .container -->
    <!-- Bootstrap core javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    % compress js %

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src=" STATIC_URL js/bootstrap.min.js"></script>
    <script src=" STATIC_URL js/scrolltopcontrol.js"></script>
    <script src=" STATIC_URL js/lightbox-2.6.min.js"></script>
    <script src=" STATIC_URL js/custom.js"></script>

    % endcompress %

    % block otherfooter %% endblock %


</body>
</html>

这是我完整的孩子:

    % extends "base.html" %

    % block content %
    <!-- Wrapper -->
    <div class="wrapper">

      <!-- Topic Header -->
      <div class="topic">
        <div class="container">
          <div class="row">
            <div class="col-sm-4">
              <h3>Sign In</h3>
            </div>
            <div class="col-sm-8">
              <ol class="breadcrumb pull-right hidden-xs">
                <li><a href="/">Home</a></li>
                <li class="active">Log In</li>
              </ol>
            </div>
          </div>
        </div>
      </div>

      <div class="container">
        <div class="row">
          <div class="col-md-6 col-md-offset-3 col-sm-8 col-sm-offset-2">
            <div class="sign-form">
              <div class="sign-inner">
                <h3 class="first-child">Log In To Your Account</h3>
                <hr>
                  <form role="form" action="" method="post">
                      % csrf_token %
                      <div class="input-group">
                          <span class="input-group-addon"><i class="fa fa-user"></i></span>

                          form.username

                      </div>
                      <br>
                      <div class="input-group">
                          <span class="input-group-addon"><i class="fa fa-lock"></i></span>

                          form.password

                      </div>
                      <div class="checkbox">
                          <!--<label>
                              <input type="checkbox"> Remember me
                          </label>-->
                      </div>
                      <button type="submit" class="btn btn-red" name="login_form">Submit</button>
                      <hr>
                  </form>
                <p>Not registered? <a href="/register">Create an Account.</a></p>
                <div class="pwd-lost">
                  <div class="pwd-lost-q show">Lost your password? <a href="#">Click here to recover.</a></div>
                    <!--https://github.com/brutasse/django-password-reset-->

                  <div class="pwd-lost-f hidden">
                    <p class="text-muted">Enter your email address below and we will send you a link to reset your password.</p>
                    <form class="form-inline" role="form">
                      <div class="form-group">
                        <label class="sr-only" for="email-pwd">Email address</label>
                        <input type="email" class="form-control" id="email-pwd" placeholder="Enter email">
                      </div>
                      <button type="submit" class="btn btn-blue">Send</button>
                    </form>
                  </div>
                </div> <!-- / .pwd-lost -->
              </div>
            </div>
          </div>
        </div> <!-- / .row -->      
      </div> <!-- / .container -->

    </div> <!-- / .wrapper -->

  % endblock %

以下是 html 的呈现方式:

<html lang="en">
<head>
    <style type="text/css"></style>
</head>
<body style="">
    <!-- base.html -->
    <!--[if lt IE 8 ]><html class="ie ie7" lang="en"> <![endif]-->
    <!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
    <!--[if (gte IE 8)|!(IE)]><!-->
    <!--<![endif]-->

    <meta charset="utf-8">
    <!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->

    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Navigation -->
    <header>
        <div class="navbar navbar-default navbar-fixed-top" role="navigation">
            <div class="container">
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                        <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="/"><img src="/static/img/logo.png" ></a>
                </div>
                <div c

这是我呈现该页面的方式(但我对其他模板使用“render_to_response”并获得相同的结果:

url(r'^about-us/', TemplateView.as_view(template_name="about-us.html"), name='about-us'),

提前感谢您的帮助。

【问题讨论】:

看起来您可能会包含 base.html 而不是扩展它。 想过,但没有。我肯定在使用扩展。 【参考方案1】:

在 2019 年遇到同样的问题后,正如 Majid Mobini 所说,这是由于 Visual Studio 对源文件的编码。由于 VS 2019 不再具有高级保存选项,我的解决方案是从 VS Marketplace 安装修复文件编码扩展并重新保存我的文件 - 然后按预期将元数据放置在 HEAD 中。

【讨论】:

【参考方案2】:

我也有类似的问题。

将我的文件编码更改为“utf-8 without BOM”解决了我的问题。

(http://validator.w3.org/ 可能会帮助你。)

【讨论】:

【参考方案3】:

您确定您正在编辑正确的“base.html”文件吗?看来您可能正在编辑同名但位于不同位置的文件。另外,您是否使用 Javascript 或其他东西来填充您的 &lt;navigation&gt; &lt;/navigation&gt; ?呈现的结果与您的 base.html 不匹配。如果您使用 Javascript 生成此导航部分,这可能是您的罪魁祸首。如果为了可读性而对其进行了编辑,那么我将在您的项目文件夹中搜索“base.html”或“about-us.html”的另一个实例。您可能会发现您正在编辑错误的文件。你能发布完整的文件“base.html”和“about-us.html”以及整个响应吗?

编辑:我相信问题可能出在您的“othermeta”块中。可以看到以下几行渲染正确:

<meta charset="utf-8">
<!--<meta http-equiv="X-UA-Compatible" content="IE=edge">-->

<meta name="viewport" content="width=device-width, initial-scale=1">

这是结果中变得混乱的地方。当您呼叫% block othermeta % 时,这也是您基地的重点。你有那个块里面有内容的原因吗?我不确定它是否正确接受了 % endblock %。如果您希望块 othermeta 是动态的,则必须将它放在自己的 othermeta.html 中,它也扩展了 base.html。然后,您可以将代码更改为:

% block othermeta % % endblock %

我认为错误可能是您试图在扩展模板中定义此块的内容。我和你一样是新手,所以我可能完全错了,但是现在尝试完全删除你的 othermeta 块,看看是否有帮助。

希望这会有所帮助!

【讨论】:

抱歉 - 这些是经过编辑的版本。没有花哨的 JS 用于生成导航。奇怪的是,我的 Index.html 可以正确呈现,但站点中的所有其他页面却没有。 感谢您发布更多信息!我已经编辑了我的答案。运气好吗? 不幸的是没有运气。在我回来调查之前,我最终只是做了一些 hackey 硬编码。

以上是关于Django 1.5:扩展 base.html 时,我的 <head> 标签显示在我孩子的 <body> 中的主要内容,如果未能解决你的问题,请参考以下文章

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

Django 模板继承(扩展的位置)

扩展在 Django 1.9 中不起作用

无法在 Django 上扩展 html 模板

从项目根 Django 扩展模板

Django模板扩展了错误的模板