/accounts/profile/ 处的 TemplateSyntaxError

Posted

技术标签:

【中文标题】/accounts/profile/ 处的 TemplateSyntaxError【英文标题】:TemplateSyntaxError at /accounts/profile/ 【发布时间】:2018-03-08 15:04:54 【问题描述】:

我收到一个错误:

TemplateSyntaxError at /accounts/profile/
<ExtendsNode: extends "registration/accounts/base.html"> must be the first tag in the template

我写了base.html

% load staticfiles %
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="% load staticfiles 'bootflat/css/bootflat.min.css' %">
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  </head>
  <body>
    <nav class="navbar navbar-default" role="navigation">
        <div class="navbar-header">
            <p class="navbar-text">HELLO</p>
            % if user.is_authenticated %
            <p class="navbar-text">  user.get_username </p>
            % endif %
        </div>
    </nav>

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

    <!-- jQuery (necessary for Bootstrap's javascript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="% static 'bootstrap/js/bootstrap.min.js' %"></script>
  </body>
</html>

profile.html 是:

% load staticfiles %
% extends "registration/accounts/base.html" %
% block content %
  <html lang="ja">
    <head>
      <meta charset="utf-8">
      <link rel="stylesheet" href="% static 'bootflat/css/bootflat.min.css' %">
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    </head>
    <body>

  <a href="% url 'kenshinresults'%">SEE YOUR PHOTO</a>

    <div class="container">
      <form action="% url 'accounts:upload_save' %" method="POST" enctype="multipart/form-data">
        % csrf_token %
        <p>SEND PHOTO</p>
        <input type="file" name="files[]" multiple>
        <input type="hidden" value=" p_id " name="p_id">
        <input type="submit" value="Upload">
      </form>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    </body>
  </html>

% endblock %

我发现只有base.html 显示正确,但是当我尝试base.html 继承profile.html 时,出现此错误。之前,这两个文件是正确加载的,但是当我将href="% static 'bootflat/css/bootflat.min.css' %" 添加到profile.html 时,就会发生此错误。为什么会发生这样的错误?我怎样才能解决这个问题?我认为在 profile.html 中添加 % load staticfiles % 是对的,但它错了吗?

【问题讨论】:

您能否将收到的完整回溯错误添加到您的问题中? 你不明白什么?错误消息是完全明确的。 Extends 必须是 profile.html 中的第一个标签。 【参考方案1】:

您应该将您的base.html 文件视为布局,并将您的profile.html 视为在此布局中呈现的模板文件。

出于这个原因:

load staticfiles 块应该插入到 base.html 中,并且应该插入到您正在加载静态资产的每个文件中(请参阅下一个要点) 当您引用 src= 中的静态资产时,足以使用 static 路径帮助程序加载它 profile.html 应该扩展布局 base.html 并且 % block content % 中包含的任何内容都将呈现在您正文中的块内容标记内

base.html

<html lang="ja">
  <head>
    <meta charset="utf-8">
    % load staticfiles %
    <link rel="stylesheet" href="% static 'bootflat/css/bootflat.min.css' %">
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>

  </head>
  <body>
  % block content % 
  <!-- your body is fine -->
  % end block %
  </body>
</html>

profile.html

% extends "registration/accounts/base.html" %

% block content %
    <a href="% url 'kenshinresults'%">SEE YOUR PHOTO</a>
    <form action="% url 'accounts:upload_save' %" method="POST" enctype="multipart/form-data">
        % csrf_token %
        <p>SEND PHOTO</p>
        <input type="file" name="files[]" multiple>
        <input type="hidden" value=" p_id " name="p_id">
        <input type="submit" value="Upload">
    </form>  
% endblock %

编辑 正如丹尼尔·罗斯曼所说

【讨论】:

您的评论有点误导。通常你确实需要在每个子模板中加载模板标签;您在这里不这样做的原因是因为无论如何都不需要该子模板中的所有 HTML。 感谢您的澄清。你想编辑我的答案吗?否则我会相应地编辑它。【参考方案2】:

错误提示您必须先在模板中写入extends 标签。 您可以在documentation中阅读更多相关信息

所以,你应该先写% extends "registration/accounts/base.html" %profile.html

% extends "registration/accounts/base.html" %
% load staticfiles %
% block content %
  ...
% endblock %

之后一切都会好起来的!

【讨论】:

以上是关于/accounts/profile/ 处的 TemplateSyntaxError的主要内容,如果未能解决你的问题,请参考以下文章

升级 Django 和 allauth 在 /accounts/profile/ 返回 KeyError

找不到页面 (404)

使用 Django 注册应用程序在 Django 中处理帐户/个人资料的好地方在哪里?

python django 做了个web ,在登录界面我想直接调用系统的login模板,可是每次登录成功之后就跳到

url中的django用户名,而不是id

Django 注册 url 重定向