2

Python、Google AppEngine、Jinjaは初めてです。以下に投稿したコードが多すぎる場合は、申し訳ありません。これは、StackOverflowに投稿した最初の質問です。

(クラス用の)ブログを作成していますが、ユーザーの投稿の改行文字「\n」を置き換える必要があります。データベースを照会する関数は、その結果をrender()関数に送信します。

「\n」を置き換えることになっているコード行を追加するまで、すべてのコードは完全に機能します。

私はさまざまな編集を行いましたが、AppEngine、Jinja、またはPythonがそれを満たすために何をしてほしいかを推測することはできません。

私のデータベースクラスは、' post_content 'を含む4つのタイプでdb_blogKindを設定します

class db_blog(db.Model):
    post_subject = db.StringProperty(required = True)
    post_content = db.TextProperty(required = True)
    post_created = db.DateTimeProperty(auto_now_add = True)
    post_last_modified = db.DateTimeProperty(auto_now_add = True)

'Newpost'クラスこれが以下のBlogクラスから' query_select 'オブジェクトを受け取るようにします。

class Newpost(webapp2.RequestHandler):
    def write(self, *args, **kwds):
        self.response.out.write(*args, **kwds)

    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)

    def render(self, template, **kwds):
        self._render_text = self.post_content.replace("\n", "<br />") ##<-- See here 
        self.write(self.render_str(template, **kwds))

Blogクラスは、すべてのユーザー投稿を取得し、それらを「Newpost」に送信してレンダリングします。

class Blog(Newpost):
    def get(self):
        query_select = db.GqlQuery("SELECT * FROM db_blog ORDER BY post_created DESC")
        self.render('blog_posts.htm', query_select = query_select)

1.上記のように、コードは次のエラーを生成します。

AttributeError:'ブログ'オブジェクトに属性'post_content'がありません

クラスBlogはdb_blogから継承する必要があると思いますので、(#2を参照)

2.ブログクラスのパラメータリストにdb_blogを追加すると、新しいエラーが発生します。

AttributeError:'NoneType'オブジェクトには属性がありません'replace'

エラーは、存在しないオブジェクトを渡していることを示していると思うので、本当に混乱しています。「\n」文字を置き換えようとしている行をコメントアウトすると、このコードは完全に実行されます。オブジェクトを渡さないようにするにはどうすればよいでしょうか。またはそれが==なしだと主張しますか?

さらに重要なのは、どうすればそれを機能させることができるかです!

ここまで読んでくれたあなたと、私を動かすことができる富の王国に感謝します。

4

2 に答える 2

1

属性エラーが発生する理由は、selfinが()をNewpost.get参照しており、必要な投稿を参照していないためです。ビュー関数で変換を定義する代わりに、モデルのプロパティとして変換を追加することをお勧めします。RequestHandlerBlog

class db_blog(db.Model):

    post_subject = db.StringProperty(required = True)
    post_content = db.TextProperty(required = True)
    post_created = db.DateTimeProperty(auto_now_add = True)
    post_last_modified = db.DateTimeProperty(auto_now_add = True)

    @property
    def escaped_content(self):
        # possibly want to escape HTML in your post_content first
        return self.post_content.replace("\n", "<br />")

query_select次に、 (現在行っているように)テンプレートに渡すことができます。

{% for post in query_select %}
{{ post.escaped_content | safe }}
{% endfor %}

ジンジャがあなたを逃れるので、あなたは上記の安全を使う必要があります<br />。私はあなたのテンプレートを見ることができないので、これがあなたがしていることに正確に合っているかどうかはわかりませんが、うまくいけばあなたはポイントを得るでしょう。

上記のジンジャの3行を説明するには:

  1. {% for post in query_select %}-forループと同じように、投稿を繰り返し処理します。各投稿はdb_blog(クエリからの)インスタンスである必要があります。
  2. post.escaped_contentescaped_contentPythonでdb_blogモデルの属性を呼び出すのとまったく同じです。
  3. {{ post.escaped_content | safe }}safeエスケープされたコンテンツによって生成された文字列にフィルターを適用します(なしsafeの場合、jinjaはに変換<br />され&lt;br /&gt;ます(文字通りページに表示<br />されます)。
  4. {% endfor %}forループを終了します。
于 2012-08-23T04:19:02.433 に答える
1

私がこれを書いているときに、@ JeffTratnerは、置換をモデルのプロパティにするための素晴らしい提案をしました。私は間違いなくそれを良い解決策として支持しているので、うまくいけば、これはあなたが何が起こっているのかを理解するのに役立つでしょう:)


いらっしゃいませ!私はjinjaを使用したことがない(GAEの専門家でもない)と言ってこれを前置きするので、あなたの問題を引き起こしていると私が信じていることに焦点を当てようとします(そして他のはるかに賢い人々は私をすぐに修正します)。

エラー

Gqlを使用してデータストアにクエリを実行すると、結果は反復可能になります。コードでquery_selectは、はそれらの反復可能オブジェクトの1つであり、各項目はdb_blog指定した4つのプロパティを持つエンティティです。db_blog(注:おそらく[スタイルの規則など]に変更できますBlog。とにかく後でそのクラスを削除することをお勧めします:))

あなたがやろうとしていることは、改行文字を'sに置き換えることであるように見えます。そうするために、あなたはでメソッドを<br>呼び出しています。これに伴う問題は、このコンテキストがインスタンスであり、実際に必要なもの(内部のアイテム)とは完全に異なることです。編集: JeffTratnerの方法は私が以前持っていたものよりも優れているので、私は私が持っていたものを削除し、彼が提案したようにモデルを設定したと仮定します:)その場合、クエリを実行して結果をに渡すことができますテンプレート:replaceself.post_contentselfBlogquery_select

query_select = db.GqlQuery("SELECT * FROM db_blog ORDER BY post_created DESC")
self.write(self.render_str(template, **kwds))

重要なポイント-データストアにクエリを実行すると、[ほぼ]常に反復可能オブジェクトが返されます。したがって、返されたデータを使用して追加の処理を行う場合は、結果を反復処理する必要があります。

query_select = db.GqlQuery("SELECT * FROM db_blog ORDER BY post_created DESC")
for result in query_select:
    # Do stuff...

構造

あなたの意図がよくわからないので、これを一粒の塩と一緒に取ってください、しかしBlogそれ自身のクラスである理由はありますか?getNewpostにメソッドが表示されません-直接アクセスしたことはありますか?Blogそうでない場合は、完全に削除してgetメソッドをに移動することで、同じ機能を実現できますNewpostか?

class Newpost(webapp2.RequestHandler):
    def get(self):
        query_select = db.GqlQuery("SELECT * FROM db_blog ORDER BY post_created DESC")
        self.render('blog_posts.htm', query_select = query_select)

    def write(self, *args, **kwds):
        self.response.out.write(*args, **kwds)

    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)

    def render(self, template, **kwds):
        self.write(self.render_str(template, **kwds))

この構造は、へのすべてのget呼び出しがNewpostデータストアにクエリを実行し、結果をレンダリングすることを意味します(個別のクラスは必要ありません)。また、これは私がjinjaに慣れていないためかもしれませんが、おそらく//メソッドを1つに凝縮できるようですが、現在render機能しているので待つことができると思います:))。あなたが試してみたい場合のために、これは完全にテストされていない(そしておそらく間違っている)、おそらくそれを行う方法です:render_strwrite

class Newpost(webapp2.RequestHandler):
    def get(self):
        query_select = db.GqlQuery("SELECT * FROM db_blog ORDER BY post_created DESC")
        self.render('blog_posts.htm', query_select = query_select)

    def render(self, template, **kwds):        
        t = jinja_env.get_template(template)
        self.response.out.write(t.render(**kwds))

テキストの壁でごめんなさい-うまくいけば、そこに何かが役立つでしょう!

于 2012-08-23T04:43:03.800 に答える