3

Djangoテンプレートで次のことを実行しようとしています。

    {% for embed in embeds %}
           {% embed2 = embed.replace("&lt;", "<") %}
           {{embed2}}<br />
    {% endfor %}

ただし、そのようなことを行うと、常に無効なブロックまたは構文エラーが発生します(つまり、ループ内の{%%}コードを意味します)。Pythonには「スコープ」を表す{}がないので、これが私の問題かもしれないと思いますか?コードのフォーマットが間違っていますか?

編集:正確なエラーは次のとおりです。Invalid block tag: 'embed2'

Edit2:誰かが私がやっていることがDjangoテンプレートでサポートされていないと言ったので、私はコードを書き直して、ロジックをビューに入れました。私は今持っています:

embed_list = []
for embed in embeds:
    embed_list[len(embed_list):] = [embed.replace("&lt;", "<")] #this is line 35
return render_to_response("scanvideos.html", {
    "embed_list" :embed_list
})

ただし、エラーが発生します:'NoneType' object is not callable" on line 35

4

5 に答える 5

7

Djangoテンプレートはそれをサポートしていないと確信しています。置換操作では、さまざまなフィルターを調べます。

テンプレートではなく、ビューにできるだけ多くのロジックを保持するようにしてください。

于 2008-11-09T19:44:06.090 に答える
6

Djangoのテンプレート言語は意図的に妨げられています。プログラミング以外の設計者が使用する場合、これは間違いなく良いことですが、少しプログラミングを行う必要がある場合もあります。(いいえ、それについては議論したくありません。これはdjango-usersとdjango-devで何度か出てきました。)

あなたが試みていたことを達成するための2つの方法:

  • 別のテンプレートエンジンを使用してください。Djangoとの統合について完全に説明されている良い例については、Jinja2を参照してください。
  • Python式を実行できるようにするテンプレートタグを使用します。limodouのExprタグを参照してください。

私はいくつかの場所でexprタグを使用しましたが、これにより作業がはるかに楽になりました。私の次の主要なDjangoサイトはjinja2を使用します。

于 2008-11-10T01:25:36.913 に答える
3

「NoneTypeオブジェクトを呼び出せない」というメッセージが表示される理由がわかりません。これは、行のどこかに「foo(...)」のような式があることを意味し、fooがNoneであることを意味します。

ところで:あなたはembed_listを拡張しようとしています、そしてそれはこのようにそれをするのがより簡単です:

embed_list = []
for embed in embeds:
    embed_list.append(embed.replace("&lt;", "<")) #this is line 35
return render_to_response("scanvideos.html", {"embed_list":embed_list})

リスト内包表記をさらに簡単に使用できます。

embed_list = [embed.replace("&lt;", "<") for embed in embeds]
于 2008-11-09T20:04:59.947 に答える
2

Djangoテンプレートは、 KidGenshiとは異なり、独自の構文を使用します。

独自のカスタムテンプレートタグをロールする必要があります。

主な理由は、良い習慣を強制することだと思います。私の場合、これらの特別なテンプレートタグをチームのデザイナーに説明するのにすでに苦労しています。プレーンなPythonであれば、Djangoをまったく選択しなかったと確信しています。パフォーマンスの問題もあると思います。Djangoテンプレートのベンチマークは高速ですが、前回genshiをチェックしたときははるかに低速でした。ただし、Pythonが自由に埋め込まれているためかどうかはわかりません。

アプローチを確認して独自のカスタムテンプレート(Ruby on Railsの「ヘルパー」の同義語)を作成するか、別のテンプレートエンジンを試す必要があります。

あなたの編集のために、Pythonにはより良い構文があります:

embed_list.append(embed.replace("&lt;", "<"))

エラーが修正されるかどうかはわかりませんが、少なくともJavaScript風ではありません;-)

編集2:Djangoはすべての変数を自動的にエスケープします。| safe filter:を使用して生のHTMLを適用できます{{embed|safe}}

ドキュメントを読むのに少し時間がかかる方がいいでしょう。これは本当に素晴らしくて便利です。

于 2008-11-09T19:58:50.787 に答える
2

スライス割り当てを使用してリストを増やす代わりに

embed_list[len(embed_list):] = [foo]

あなたはおそらくただやるべきです

embed_list.append(foo)

しかし、実際には、自分で行うのではなく、ライブラリ関数を使用してhtmlをエスケープ解除してみてください。

そのNoneTypeエラーは、ある時点でembed.replaceがNoneのように聞こえます。これは、リストが文字列のリストでない場合にのみ意味があります。いくつかのアサートなどで再確認することをお勧めします。

于 2008-11-09T20:04:55.097 に答える