2013-10-16 36 views
0

我有評論對象具有user_key屬性,並且我將Comment對象傳遞給了我的Flask模板,但是我想顯示User.username屬性旁邊的每條評論,當我在模板中時,我只有user_key。一旦我進入模板後,如何基於用戶密鑰訪問用戶對象?如何從Flask模板中的user_key獲取User對象

這裏是我的模型類的樣子:

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 
           ) 

最後,在模板文件,這就是我d喜歡在用戶對象上訪問像我的用戶名和頭像屬性的內容:(此代碼僅在要放置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

您可以使用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 %} 
    
+0

這正是我所需要的!感謝您的幫助! –

2

@萊昂的答案是正確的,但我想把我最終在這裏做的事情放在這裏,讓其他人可以看到它:

我挖了一圈,發現有用於聲明過濾器的裝飾,所以我這樣做:

@app.template_filter() 
def get_username_by_user_key(user_key): 
    user = user_key.get() 
    return user.username 
相關問題