2

HTML テーブルに表示したい文字列項目の配列があり、テンプレートで最も簡単な方法は「メッセージ」フォームのようです。私はそれらを「活動」と呼んでいます。

{% if activities %}
  <table class="activities">
    <tr>
     {% for activity in activities %}
       <td>{{ activity }}</td>
     {% endfor %}
    </tr>
  </table>
{% endif %}

アクティビティは配列を返す単純なタグである可能性があると考えましたが、他のスタックオーバーフローの回答 (以下にリンク) から、これは値を返すためではなく、テンプレートに配置する文字列を返すためであることがわかります。

この配列にコンテキストやパラメーターは必要ありませんが、ページごとに異なる形式で表示される可能性があるため、タグがテーブルの「innerHTML」を返すことは望ましくありません。

それ、どうやったら出来るの?私はエクストラファイルで次のことを試しました(そして、それが呼び出されていることを確認するために、意図的に構文エラーを挿入し、このページに移動したときにそれらがトリガーされたことを確認したので、それらを削除しました):

from django import template

register = template.Library()

@register.simple_tag
def activities():
  return ("A", "B")
activities = register.simple_tag(activities)

また、デコレータだけで、「登録」の呼び出しだけで(戻り値の設定の有無にかかわらず)試してみましたが、どれも機能しませんでした。テーブルは常に空でした。

stackoverflow には関連する質問がたくさんありますが、それぞれがわずかに異なるケースに合わせて作成されているように見えます。また、inclusion_tag を使用した最も近い.

4

1 に答える 1

2

Django >= 1.4 を使用している場合、割り当てタグを作成する簡単な方法があります。asこれらは、キーワードの後に​​指定されたテンプレート変数に戻り値を格納します。あなたの場合、それは次のようになります。

{% get_activities as activities %}
{% if activities %}
  <table class="activities">
    <tr>
     {% for activity in activities %}
       <td>{{ activity }}</td>
     {% endfor %}
    </tr>
  </table>
{% endif %}

このタグの背後にあるコードは非常に単純です。本当に重要なのはassignment_tagデコレータだけです。

from django import template

register = template.Library()

@register.assignment_tag
def get_activities():
    return ("A", "B")

Django のバージョンが 1.4 より古い場合でも、これは実行可能ですが、コンパイル関数とノード クラスを作成するには、より多くのボイラープレート コードが必要です。実際、Django のドキュメントでは、このアプローチについて直前に説明していassignment_tagます。

于 2012-11-21T00:35:03.287 に答える