0

厳密なMVCで非常に厄介なことの1つは、テンプレートで最小の処理を実行できることです。通常は良い習慣ですが、この場合は邪魔になります。

  • 多くのオブジェクトのクエリセットでforループを作成し、いくつかの属性を表示します。
  • 属性はプロパティであり、処理が重くなります(2回トリガーしたくありません)。
  • 最後に、これらの属性の値の合計を表示する必要があります。

ここで、ビューで合計を1回実行してから、ループを再実行して(そしてプロパティを再度呼び出して)表示する必要があります。ビューで一度ループして結果をキャッシュすることでこれを改善できますが、この制限を回避するためだけにコードを取得し、より多くのメモリを使用します。

プロジェクトのこの段階では、それほど大したことではありません。パフォーマンスはまだ問題ではありません。しかし、私は本当にこれに対する解決策があることを知りたいです。

私の最善の策は、その仕事をするテンプレートタグを書くことですが、それはそのような雑用です:-)あなたはすでにそれをしただろう誰かを知っていますか?

例えば:

理想的には、次のようになります。

{% for object in object_list %}
    - {% sum_in_and_print object.property total %}
{% endfor %}
total {{ total }}

表示されます:

- 2
- 3
- 1
total 6
4

6 に答える 6

1

私はそれが雑用であることを理解していません。宛先変数がコンテキスト内にあるかどうかを確認し、そうでない場合は、リスト内の最初の要素のクラスの空の構築されたオブジェクトで初期化し、蓄積します。

于 2010-10-13T13:33:14.537 に答える
1

ビューまたはテンプレートで合計を計算する代わりに、QuerySet.Annotate(total_x=Sum('x')) を使用してデータベースに計算を任せるのはどうですか?

余談ですが、実際の問題を解決しようとすると、明確な答えがない場合、直接の質問に答えないことが必要になる場合があると思います。

于 2010-10-13T21:16:18.900 に答える
0

うまく書くのはかなり難しいタグではありません。評価順序が正しいかどうか注意する必要があります (データの上に合計が表示される場合があります)。多くの集計セクションを持つことができること (おそらくデータも)。おそらく次の構造が必要になります。

{% raport %}
    {% sumup %}
        ...
    {% endsumup %}
    {% data %}
        ...
    {% enddata %}
    {% sumup %}
        ...
    {% endsumup %}
{% endraport %}

編集: また、マルチレベル構造を解析するのに苦労します:

{% raport %}
    {% sumup %}
        ...
    {% endsumup %}
    {% data %}
        {% raport %}
            {% sumup %}
                ...
            {% endsumup %}
            {% data %}
                ...
            {% enddata %}
            {% sumup %}
                ...
            {% endsumup %}
        {% endraport %}
    {% enddata %}
    {% sumup %}
        ...
    {% endsumup %}
{% endraport %}
于 2010-10-13T10:14:37.947 に答える
0

ビューでこれを行っていない説得力のある理由はありますか?

以下よりも簡単なこと:

total = sum([o.property for o in object_list])

ジェネリックを使用することが目標であっても、いつでもビュー関数でラップできます。

あなたが具体的に必要としている機能は、変数を出力して任意の変数に追加することです。これは非常にユニークな機能であり、独自のテンプレートタグを絶対に作成したいと思うでしょう。

幸いなことに、これは非常に簡単です。

アップデート

質問で言ったように、プロパティは HEAVY 処理をトリガーします。それらを2回トリガーしたくありません...

したがって、代わりにこれを試すことができます:

rendered_object_list = []
for o in object_list:
    rendered_object_list.append({
        'field1': o.field1,
        'field2': o.field2,
        'property': o.property
    })
total = sum(o['property'] for o in rendered_object_list)

ビューで一度処理し、テンプレートに出力すると、ディクショナリになり、ディクショナリ内のすべてが処理済みになります。

于 2010-10-13T15:51:48.647 に答える
0

Mako のような別のテンプレート システムを調べてください。特に Mako では、完全な Python コードをテンプレート内で実行できます。

于 2010-10-13T13:20:12.573 に答える
0

あなたが開発しているプロジェクトはわかりませんが、すでにユーザーに JavaScript を要求している場合は、jQuery.calculation プラグインをチェックしてください。これは、すべてのばかげた計算をクライアント側に移行するための優れたツールです。

于 2010-10-13T13:14:37.407 に答える