python タグ - モデル内の関数を呼び出すdjangoテンプレートシステム




作成 引数 (5)

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

あなたは、あなたが望むものを何でもできるくらいの機能を書いています。 あなたはそれを読み取り専用のプロパティにします。 テンプレートからプロパティを呼び出します。

Etvoilà!!!!

モデルの関数を以下のようなテンプレートで呼びたいと思っています:

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 %}

あらゆる場所で実行されているプロパティがあまりにも多く見つかったり、他のすべてのメソッドのテンプレートフィルタがある場合は、IRCで@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)

引数> 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 %}

(構文が{{ {% {{に変更されていることに注意してください。

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


クラスベースのビューを使用している場合:

#
# in settings.py
#
YOUR_CUSTOM_SETTING = 'some value'

#
# in views.py
#
from django.conf import settings #for getting settings vars

class YourView(DetailView): #assuming DetailView; whatever though

    # ...

    def get_context_data(self, **kwargs):

        context = super(YourView, self).get_context_data(**kwargs)
        context['YOUR_CUSTOM_SETTING'] = settings.YOUR_CUSTOM_SETTING

        return context

#
# in your_template.html, reference the setting like any other context variable
#
{{ YOUR_CUSTOM_SETTING }}




python django django-models django-templates