web-dev-qa-db-ja.com

djangoテンプレートシステム、モデル内の関数の呼び出し

次のようなテンプレートでモデルから関数を呼び出したい

class ChannelStatus(models.Model):
 ..............................
 ..............................

    def get_related_deltas(self,epk):
        mystring = ""
        if not self.get_error_code_delta(epk):
            return mystring
        else:
            for i in self.get_listof_outage():
                item = i.error_code.all()
                for x in item:
                    if epk == x.id:
                        mystring= mystring +" "+str(i.delta())
        return mystring         

そして、テンプレートからこれを呼び出したい場合:レンダリング中に、channel_status_listを

channel_status_list = ChannelStatus.objects.all()

{% for i in channel_status_list %}
  {{ i.get_related_deltas(3) }}
{% endfor %}

これは機能しません。何も消費しない関数を呼び出すことはできますが、パラメータがある場合はどうすればよいかわかりません

乾杯

61
crib

テンプレートのパラメーターを使用して関数を呼び出すことはできません。これはビューでのみ実行できます。あるいは、 カスタムテンプレートフィルター を記述できます。これは次のようになります。

@register.filter
def related_deltas(obj, epk):
    return obj.get_related_deltas(epk)

したがって、テンプレートでこれを実行できます。

{% for i in channel_status_list %}
  {{ i|related_deltas:3 }}
{% endfor %}
81
Daniel Roseman

メソッドが引数を必要としない場合は、@ propertyデコレータを使用して、テンプレートで通常どおりアクセスできます。

class ChannelStatus(models.Model):
    ...
    @property
    def function_you_want_as_property(self):
        mystring = ""
        ...
34
sabalaba

引数が1を超える場合は、 シンプルタグ を使用します。

@register.simple_tag
def related_deltas(obj, epk, second_arg):
    return obj.get_related_deltas(epk, second_arg)

テンプレート:

{% for i in channel_status_list %}
  {% related_deltas i 3 4 %}
{% endfor %}

{{から{%への構文の変更に注意してください)

positionalパラメーター(例:related_deltas i 3 second_arg=4 debug=true)を取ることができます。

6
laffuste

あらゆる場所で実行されているプロパティが多すぎる場合、または記述する他のすべてのメソッド用のテンプレートフィルターがある場合は、別のソリューションがIRC thanks @FunkyBobで提案されました。えーっと、ファンキーだけど、特定のケースではナイスです。

  class MethodProxy(object):
        """For consolidating into 1 method the calling of methods with various single args
        (suitable dictionary keys)

        class MyModel(models.Model):
            ...

            def magic(self, value):
                # Free the ponies

            def thing(self):
                return MethodProxy(self.magic)

        # Usage
        >>> m = MyModel()
        ...
        >>> m.thing['value'] == m.magic('value')

        # template
        {{ m.thing.value }}

        """

        def __init__(self, method):
            self.method = method
        def __getitem__(self, key):
            return self.method(key)
5
Skylar Saveland

別のオプションは、プロパティを定義することです。 http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/ を参照してください。

必要なことはほとんど何でもできる関数を作成します。読み取り専用プロパティにします。テンプレートからプロパティを呼び出します。

エボイラ!!!!

2
Arnaud Sahuguet