我有一个具有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对象数组传递给模板?看起来有点混乱,可能有更好的方式...
答案 0 :(得分:2)
您可以使用jinja2 filters来解决此类问题。您没有这样的built-in filters,但幸运的是,创建custom filters非常容易。
对于一个简单但不完整的例子:
定义一个常规的Python函数,该函数以user_key
为参数来查找User
个对象或username
。
def get_user_by_user_key(user_key):
# your logic code here, e.g.
username = get_username()
return username
在模板环境中注册:
environment.filters['get_name_by_key'] = get_user_by_user_key
在模板中使用自定义过滤器:
{% 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