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
                               )

そして最後に、テンプレート ファイルで、ユーザー オブジェクトのユーザー名やアバター プロパティなどにアクセスしたい場所です: (このコードは、必要な場所にユーザー キーを出力するだけです。 User.username を入力します。

# 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

@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 に答える
2

jinja2 フィルターを使用して、この種の問題を解決できます。このようなビルトイン フィルタはありませんが、幸いなことに、カスタム フィルタを作成するのは非常に簡単です。

単純だが完全ではない例:

  1. オブジェクトまたはuser_keyを検索するためのパラメーターとして受け取る通常の Python 関数を定義します。Userusername

    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 に答える