0

我有一个具有 user_key 属性的 Comment 对象,我将 Comment 对象传递给我的 Flask 模板,但我想在每个评论旁边显示 User.username 属性,当我在模板中时,我只有用户密钥。进入模板后,如何根据用户密钥访问用户对象?

这是我的模型类的样子:

class Base(ndb.Model, modelx.BaseX):
  created = ndb.DateTimeProperty(auto_now_add=True)
  modified = ndb.DateTimeProperty(auto_now=True)
  version = ndb.IntegerProperty(default=TIMESTAMP)
  _PROPERTIES = set([
      'key',
      'id',
      'version',
      'created',
      'modified',
    ])

class Comment(Base):
  user_key = ndb.KeyProperty(kind=User, required=True)
  comment = ndb.StringProperty(required=True)
  like_count = ndb.IntegerProperty(required=False, default=0)

class User(Base, modelx.UserX):
  name = ndb.StringProperty(indexed=True, required=True)
  username = ndb.StringProperty(indexed=True, required=True)
  email = ndb.StringProperty(indexed=True, default='')

  active = ndb.BooleanProperty(default=True)
  admin = ndb.BooleanProperty(default=False)

  federated_id = ndb.StringProperty(indexed=True, default='')
  facebook_id = ndb.StringProperty(indexed=True, default='')
  twitter_id = ndb.StringProperty(indexed=True, default='')

  _PROPERTIES = Base._PROPERTIES.union(set([
      'name',
      'username',
      'avatar_url',
    ]))

然后我像这样渲染模板:

  query = model.Comment.query()
  comment_dbs = query.fetch()

  return flask.render_template(
                               'filename.html',
                               html_class='classname',
                               title='Title here',
                               comment_dbs=comment_dbs
                               )

最后,在模板文件中,这是我想访问我的用户名和用户对象上的头像属性之类的地方:(这段代码只是在我想要的地方打印出用户密钥把用户名。

# if comment_dbs
    {% for c in comment_dbs %}
        {{c.user_key}}{{c.comment}}<br>
    {% endfor %}
# endif

我知道在 Python 中我可以做一个 key.get() 来返回我想要的对象,但是有没有办法在模板中做到这一点?

我是否需要遍历 Comment 对象,然后根据每个键查找 User 对象,然后将该 User 对象数组传递给模板?看起来有点乱,可能有更好的方法......

4

2 回答 2

2

您可以使用jinja2 过滤器来解决此类问题。没有适合您的内置过滤器,但幸运的是,创建自定义过滤器非常容易。

对于一个简单但不完整的示例:

  1. 定义一个常规 Python 函数,它user_key作为参数来查找User对象或username.

    def get_user_by_user_key(user_key):
        # your logic code here, e.g.
        username = get_username()
        return username
    
  2. 在模板环境中注册:

    environment.filters['get_name_by_key'] = get_user_by_user_key
    
  3. 在模板中使用自定义过滤器:

    {% for c in comment_dbs %}
        {{ c.user_key|get_name_by_key }} {{ c.comment }}<br>
    {% endfor %}
    
于 2013-10-16T04:11:23.033 回答
2

@Leon 的回答是正确的,但我想把我最终做的事情放在这里,以便其他人可以看到:

我挖了一圈,发现有一个装饰器用于声明过滤器,所以我这样做了:

@app.template_filter()
def get_username_by_user_key(user_key):
    user = user_key.get()
    return user.username
于 2013-10-16T15:30:59.503 回答