Program Tip

django 템플릿 시스템, 모델 내부에서 함수 호출

programtip 2020. 11. 30. 19:50
반응형

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

이것은 작동하지 않습니다. 아무것도 소비하지 않는 함수를 호출 할 수 있지만 매개 변수가있는 경우 수행 할 작업을 찾을 수 없습니다.

건배


템플릿의 매개 변수를 사용하여 함수를 호출 할 수 없습니다. 보기에서만이 작업을 수행 할 수 있습니다. 또는 다음과 같은 사용자 지정 템플릿 필터를 작성할 수 있습니다.

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

(구문이에서 {{으로 변경 되었습니다. {%)

위치 매개 변수를 사용할 수 있습니다 (예 :) related_deltas i 3 second_arg=4 debug=true.


모든 곳에서 너무 많은 속성이 실행되고 있거나 작성하는 다른 모든 방법에 대한 템플릿 필터가있는 경우 @FunkyBob 덕분에 IRC에 또 다른 솔루션이 제안되었습니다. 그것은 약간 잘, 음, 펑키하지만 어떤 경우에는 좋습니다.

  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/을 참조하십시오 .

원하는 모든 것을 할 수있는 함수를 작성합니다. 읽기 전용 속성으로 만듭니다. 템플릿에서 속성을 호출합니다.

Et voilà !!!!

참고 URL : https://stackoverflow.com/questions/1333189/django-template-system-calling-a-function-inside-a-model

반응형