PythonコードをDjangoテンプレート内に配置するたびに構文エラーが発生する
-
07-07-2019 - |
質問
Djangoテンプレートで次のことをしようとしています:
{% for embed in embeds %}
{% embed2 = embed.replace("<", "<") %}
{{embed2}}<br />
{% endfor %}
ただし、そのようなことをすると、無効なブロックまたは構文エラーが常に発生します(ループ内で{%%}コードを意味します)。 Pythonには、「スコープ」を示す{}がありません。だからこれが私の問題かもしれないと思う?コードを間違ってフォーマットしていますか?
編集:正確なエラー:無効なブロックタグ: 'embed2'
Edit2:誰かが私がやっていることはDjangoテンプレートでサポートされていないと言ったので、ビューにロジックを入れてコードを書き直しました。私は今持っています:
embed_list = []
for embed in embeds:
embed_list[len(embed_list):] = [embed.replace("<", "<")] #this is line 35
return render_to_response("scanvideos.html", {
"embed_list" :embed_list
})
しかし、エラーが発生しました: 'NoneType' object is not callable&quot; 35行目
。
解決
リストを拡大するためにスライス割り当てを使用する代わりに
embed_list [len(embed_list):] = [foo]
おそらくあなたはすべきです
embed_list.append(foo)
しかし、実際には、自分でやるのではなく、ライブラリ関数でhtmlのエスケープを解除してみてください。
ある種のembed.replaceがNoneのようなNoneTypeエラーは、リストが文字列のリストでない場合にのみ意味があります-いくつかのアサートまたは類似のものでそれを再確認したい場合があります。
他のヒント
Djangoテンプレートはそれをサポートしていないと確信しています。 置換操作では、さまざまなフィルターを調べます。
テンプレートではなく、ビューでできる限り多くのロジックを保持するように努める必要があります。
Djangoのテンプレート言語は故意にぐらついています。プログラミング以外のデザイナーが使用する場合、これは間違いなく良いことですが、少しプログラミングを行う必要がある場合があります。 (いいえ、私はそれについて議論したくありません。これはdjango-usersとdjango-devで何度か出てきました。)
試みていたことを達成する2つの方法:
- 別のテンプレートエンジンを使用します。 Djangoとの統合について完全に説明されている良い例については、 Jinja2 を参照してください。
- Python式を実行できるテンプレートタグを使用します。 limodouのExprタグを参照してください。
exprタグを複数の場所で使用し、ずっと簡単になりました。次の主要なDjangoサイトではjinja2を使用します。
「NoneTypeオブジェクトは呼び出し不可能」となる理由がわかりません。つまり、行のどこかが&quot; foo(...)&quot;のような式であり、fooがNoneであることを意味します。
ところで:embed_listを拡張しようとしていますが、次のようにすると簡単です:
embed_list = []
for embed in embeds:
embed_list.append(embed.replace("<", "<")) #this is line 35
return render_to_response("scanvideos.html", {"embed_list":embed_list})
さらにリスト内包表記の使用がさらに簡単になりました:
embed_list = [embed.replace("<", "<") for embed in embeds]
独自のカスタムテンプレートタグ。
主な理由は、グッドプラクティスを実施することです。私の場合、私たちのチームのデザイナーにこれらの特別なテンプレートタグを説明するのはもう大変です。単純なPythonであれば、Djangoをまったく選択しなかったはずです。パフォーマンスの問題もあると思います。Djangoのテンプレートベンチマークは高速ですが、前回genshiを確認したときはずっと低速でした。ただし、Pythonが自由に埋め込まれているためかどうかはわかりません。
アプローチを確認し、独自のカスタムテンプレート(Ruby on Railsの「ヘルパー」とほぼ同義語)を記述するか、別のテンプレートエンジンを試す必要があります。
編集のために、Pythonにはより良い構文があります:
embed_list.append(embed.replace("<", "<"))
エラーが修正されるかどうかはわかりませんが、少なくともJavaScriptesqueではありません;-)
編集2:Djangoはすべての変数を自動的にエスケープします。生のHTMLを| safeフィルターで強制できます: {{embed | safe}}
。
ドキュメントを読むのに少し時間をかけた方がいいでしょう。これは本当に便利で便利です。