TypeError:' Key'对象不可迭代

时间:2015-12-14 09:10:08

标签: python flask

应用程序 - 在Google应用引擎上托管的Flask应用。

尝试渲染模板时出现以下错误

  File "Show_Messages.html", line 1, in top-level template code
    {% extends "AdminMaster.html" %}
TypeError: 'Key' object is not iterable

我的模板(Show_messages.html)

{% extends "AdminMaster.html" %}
{% block title %}News{% endblock %}
{% block page %}News{% endblock %}
{% block head %}
    {{ super() }}
{% endblock %}
{% block content %}
    <div class="container">
        <div class="page-header">
            <h1>News</h1>
        </div>
    <div class="col-lg-12">
        <ul class="list-group">
            {% for newsitem in newsitems %}
                <li class="list-group-item">
                    <span class="badge">
                        <a href="Edit-NewsItem?ID={{ newsitem.key.urlsafe() }}">
                            <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
                        </a>
                    </span>
                </li>
            {% endfor %}
        </ul>
    </div>
    </div>
{% endblock %}

路线功能

@message_admin_routes.route('/xxxx/xxxx-xxxx')
@authenticate_admin
def show_messages():
    breadcrumb, user = build_user_and_breadcrumbs()
    messages = MessageFactory().get_messages_key()
    return render_template('Show_Messages.html',
                           user=user,
                           breadcrumb=breadcrumb,
                           newsitems=messages)

------被修改---------

AdminMaster.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head>
<!--googleoff: snippet-->
{% block head %}
    <title>CFC Melbourne - {% block title %}{%endblock%}</title>
    <meta name="Section" content="{% block page %}{%endblock%}">
    <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://storage.googleapis.com/xxxx/xxx/xxx.css" type="text/css">
    <link rel="stylesheet" href="https://storage.googleapis.com/xxxx/xxxx/xxxx.css" type="text/css">
  <link rel="shortcut icon" href="https://storage.googleapis.com/xxxx/xxxx/favicon.ico">
    <link href='https://storage.googleapis.com/xxx/xxx.css' rel='stylesheet' type='text/css'>
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css" rel="stylesheet">
{% endblock %}
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script>
        /**
        * Function that tracks a click on an outbound link in Google Analytics.
        * This function takes a valid URL string as an argument, and uses that URL string
        * as the event label.
        */
        var trackOutboundLink = function(url) {
           ga('send', 'event', 'outbound', 'click', url, {'hitCallback':
             function () {
             document.location = url;
             }
           });
        }
    </script>
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

      ga('create', 'xxx-xx-xx', 'xxx-xx-xx.xxx.xxx');
      ga('send', 'pageview');
    </script>
</head>
<body itemscope itemtype="http://schema.org/WebPage">
<div id="wrap">
    <div id="menu">
        <nav class="navbar navbar-default" style="margin-bottom: 0px;">
            <div class="container-fluid">
                   <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <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="/Eden"><div class='logo-text-a' style="color: black">CFC Melbourne Admin</div></a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Applications <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="/Eden/Applications">List all applications</a></li>
            <li><a href="/Eden/New-Application">Create new application</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="/Eden/Vision">Vision</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">One more separated linkkk</a></li>
          </ul>
        </li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ user.nickname() }}<span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Permissions</a></li>
            <li><a href="#">User Information</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="{{ logout }}">Logout</a></li>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
            </div>
        </nav>
        {% include 'AdminBreadcrumb.html' %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</div>

<!--googleoff: snippet-->
{% block footer %}

    <script src="https://storage.googleapis.com/xxxx/js/jquery-2.1.0.min.js"></script>
    <script src="https://storage.googleapis.com/xxxx/js/bootstrap.min.js"></script>
        <script>
// Remove active for all items.
        $('.page-sidebar-menu li').removeClass('active');

        // highlight submenu item
        $('li a[href="' + this.location.pathname + '"]').parent().addClass('active');

        // Highlight parent menu item.
        $('ul a[href="' + this.location.pathname + '"]').parents('li').addClass('active');
    </script>
{% endblock%}
</body>
</html>

1 个答案:

答案 0 :(得分:1)

在您的模板代码中,您有一个for循环,它期望像列表这样的可迭代对象。但是你在这里传递的一些物品是不可迭代的。 你需要在循环之前检查项是否可迭代。下面给出一个例子;

Append

可在此处找到更多详细信息:https://stackoverflow.com/a/21006895/2336603