如何从Flask模板中的user_key获取User对象

时间:2013-10-16 03:42:58

标签: python templates flask

我有一个具有user_key属性的Comment对象,我将Comment对象传递给我的Flask模板,但是我希望在每个注释旁边显示User.username属性,当我在模板中时只有user_key。一旦我在模板中,如何根据用户密钥访问用户对象?

这是我的模型类的样子:

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
                               )

最后,在模板文件中,我希望能够访问用户对象和用户对象上的头像属性等内容:(此代码只打印出我所在位置的用户密钥)我想把User.username。

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

我知道在Python中我可以使用key.get()来返回我想要的对象,但有没有办法在模板中执行此操作?

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

2 个答案:

答案 0 :(得分:2)

您可以使用jinja2 filters来解决此类问题。您没有这样的built-in filters,但幸运的是,创建custom filters非常容易。

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

  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 %}
    

答案 1 :(得分:2)

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

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

@app.template_filter()
def get_username_by_user_key(user_key):
    user = user_key.get()
    return user.username