次のようなテンプレートでモデルから関数を呼び出したい
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 %}
これは機能しません。何も消費しない関数を呼び出すことはできますが、パラメータがある場合はどうすればよいかわかりません
乾杯
テンプレートのパラメーターを使用して関数を呼び出すことはできません。これはビューでのみ実行できます。あるいは、 カスタムテンプレートフィルター を記述できます。これは次のようになります。
@register.filter
def related_deltas(obj, epk):
return obj.get_related_deltas(epk)
したがって、テンプレートでこれを実行できます。
{% for i in channel_status_list %}
{{ i|related_deltas:3 }}
{% endfor %}
メソッドが引数を必要としない場合は、@ propertyデコレータを使用して、テンプレートで通常どおりアクセスできます。
class ChannelStatus(models.Model):
...
@property
def function_you_want_as_property(self):
mystring = ""
...
引数が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
)を取ることができます。
あらゆる場所で実行されているプロパティが多すぎる場合、または記述する他のすべてのメソッド用のテンプレートフィルターがある場合は、別のソリューションが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)
別のオプションは、プロパティを定義することです。 http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/ を参照してください。
必要なことはほとんど何でもできる関数を作成します。読み取り専用プロパティにします。テンプレートからプロパティを呼び出します。
エボイラ!!!!