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
'Program Tip' 카테고리의 다른 글
CouchDB에서 일반 사용자 만들기 (0) | 2020.12.01 |
---|---|
프로토 타입으로 이벤트 트리거 (0) | 2020.11.30 |
Rails에서 before_filter 건너 뛰기 (0) | 2020.11.30 |
산발적으로 발생하는 버그를 어떻게 재현합니까? (0) | 2020.11.30 |
프로그래밍 방식으로 현재 페이지 가져 오기 (0) | 2020.11.30 |