はうまく働いていました、私のコードをDjango 1.3にアップグレードした後、私も同じ問題が少しありました。私はalters_dataフラグを設定しようとしていて、do_not_call_in_templatesフラグも追加したチケット15791にパッチを適用しようとしました(明らかにdevバージョンでマージされています)。適切な解が得られるまで問題を回避したのは、ラムダをテンプレートに渡すのではなくラムダを返す引数なしでファクトリ関数を使うことでした。
def return_a_lambda():
return lambda x : 'x=%s' % x
c = dict(f=return_a_lambda)
>>> c['f']
<function return_l at 0x33bc668>
template.Variable('f').resolve(c)
<function <lambda> at 0x33ccaa0>
Djangoのテンプレートが故にreturn_a_lambdaが実行され、テンプレートが見返りにラムダを取得している限り、彼らは引数を必要としないように、すべてのコンテキスト変数を呼び出します。 "コンテキストをレンダリング" の下
https://docs.djangoproject.com/en/dev/ref/templates/api/
更新:
def encapsulate(func):
def wrapper():
return func
return wrapper
または短いバージョン:
def encapsulate(func):
return lambda: func
は、再利用可能なハックは、ファクトリ関数を返すファクトリ関数になります
最終コードは次のようになります。
c = dict(f=encapsulate(lambda x : 'x=%s' % x))
これは解釈が容易です。私の場合(https://github.com/rosario/mayan)、Django 1.3でコードを実行するために、これを30回aproxで実行する必要があります: '(
ありがとう。これは私が使用した回避策であり、私が私の答えで言及したチケットでそれを言及しました。私はdjangoが最初にcallable context variabesをなぜ呼び出すのだろうか?私はそれが私が文脈の中に入れたビジネスのどれでもないと言います。 :)しかし、これはdjango devのリストのための議論だと思う... – akonsu
私はそれが今、私にも起こった 'ejucovy'に起こった、ファクトリー関数としてラムダを使用することは難読化されています。 –
私はあなたに同意します、Changeset 16045は、存在してはいけない問題を '修正'することによって最悪のことを起こしています。テンプレートリゾルバは変数を呼び出そうとすべきではありません。 –