복붙노트

[PYTHON] 장고 템플릿에서 getattr () 스타일 룩업 수행하기

PYTHON

장고 템플릿에서 getattr () 스타일 룩업 수행하기

파이썬의 getattr () 메소드는 미리 특정 애트리뷰트의 이름을 모를 때 유용하다.

이 기능은 템플릿에도 유용 할 것이지만, 그렇게 할 방법을 찾지 못했습니다. 동적 속성 조회를 수행 할 수있는 기본 제공 태그 또는 기본 제공 태그가 있습니까?

해결법

  1. ==============================

    1.최근에이 코드를 사용자 지정 템플릿 태그로 작성해야했습니다. 모든 룩업 시나리오를 처리하기 위해 먼저 표준 속성 룩업을 수행 한 다음 딕셔너리 룩업을 시도한 다음 목록이 작동하도록 getitem 룩업을 시도한 다음 객체가있을 때 표준 Django 템플릿 동작을 따릅니다 찾을 수 없습니다.

    최근에이 코드를 사용자 지정 템플릿 태그로 작성해야했습니다. 모든 룩업 시나리오를 처리하기 위해 먼저 표준 속성 룩업을 수행 한 다음 딕셔너리 룩업을 시도한 다음 목록이 작동하도록 getitem 룩업을 시도한 다음 객체가있을 때 표준 Django 템플릿 동작을 따릅니다 찾을 수 없습니다.

    (업데이트 된 2009-08-26에서 목록 색인 조회도 처리 함)

    # app/templatetags/getattribute.py
    
    import re
    from django import template
    from django.conf import settings
    
    numeric_test = re.compile("^\d+$")
    register = template.Library()
    
    def getattribute(value, arg):
        """Gets an attribute of an object dynamically from a string name"""
    
        if hasattr(value, str(arg)):
            return getattr(value, arg)
        elif hasattr(value, 'has_key') and value.has_key(arg):
            return value[arg]
        elif numeric_test.match(str(arg)) and len(value) > int(arg):
            return value[int(arg)]
        else:
            return settings.TEMPLATE_STRING_IF_INVALID
    
    register.filter('getattribute', getattribute)
    

    템플릿 사용 :

    {% load getattribute %}
    {{ object|getattribute:dynamic_string_var }}
    

  2. ==============================

    2.나는 그렇게 생각하지 않는다. 그러나 컨텍스트 dict에 특성을 반환하는 사용자 지정 템플릿 태그를 작성하는 것은 그리 어렵지 않습니다. 단순히 문자열을 반환하려는 경우 다음과 같이 시도하십시오.

    나는 그렇게 생각하지 않는다. 그러나 컨텍스트 dict에 특성을 반환하는 사용자 지정 템플릿 태그를 작성하는 것은 그리 어렵지 않습니다. 단순히 문자열을 반환하려는 경우 다음과 같이 시도하십시오.

    class GetAttrNode(template.Node):
        def __init__(self, attr_name):
            self.attr_name = attr_name
    
        def render(self, context):
            try:
                return context[self.attr_name]
            except:
                # (better yet, return an exception here)
                return ''
    
    @register.tag
    def get_attr(parser, token):
        return GetAttrNode(token)
    

    이것이 데이터에서 자주 반복되는 조건이 아닌 한, 템플릿 대신보기에서이를 수행하는 것이 쉽습니다.

  3. ==============================

    3.문제의 모델에 메소드를 추가하는 작업이 끝났습니다.이 메소드에는 템플릿의 속성처럼 액세스 할 수 있습니다.

    문제의 모델에 메소드를 추가하는 작업이 끝났습니다.이 메소드에는 템플릿의 속성처럼 액세스 할 수 있습니다.

    그래도 내장 된 태그로 동적으로 속성을 조회 할 수 있다면 좋을 것 같습니다. 많은 사람들이 템플릿에 지속적으로 가지고있는 문제이기 때문에 속성을 동적으로 찾아 볼 수 있습니다.

  4. ==============================

    4.get과 getattr의 구분을 유지하면서,

    get과 getattr의 구분을 유지하면서,

    @register.filter(name='get')
    def get(o, index):
        try:
            return o[index]
        except:
            return settings.TEMPLATE_STRING_IF_INVALID
    
    
    @register.filter(name='getattr')
    def getattrfilter(o, attr):
        try:
            return getattr(o, attr)
        except:
            return settings.TEMPLATE_STRING_IF_INVALID
    
  5. ==============================

    5.내장 태그는 없지만 직접 작성하는 것은 어렵지 않습니다.

    내장 태그는 없지만 직접 작성하는 것은 어렵지 않습니다.

  6. ==============================

    6.그 발췌 문장은 내 하루를 구했는데, 나는 관계를 넘어서서 그것을 필요로하므로 나는 그것을 arg로 나눠서 그것을 바꿨다. " 재귀 적으로 가치를 얻는다. 그것은 한 줄로 할 수 있습니다 : getattribute (value, str (arg) .split ( ".") [0]), "."join (str (arg) .split ( ".") [1 :])) 하지만 가독성을 위해 4로 설정했습니다. 누군가가 이것을 사용하기를 바랍니다.

    그 발췌 문장은 내 하루를 구했는데, 나는 관계를 넘어서서 그것을 필요로하므로 나는 그것을 arg로 나눠서 그것을 바꿨다. " 재귀 적으로 가치를 얻는다. 그것은 한 줄로 할 수 있습니다 : getattribute (value, str (arg) .split ( ".") [0]), "."join (str (arg) .split ( ".") [1 :])) 하지만 가독성을 위해 4로 설정했습니다. 누군가가 이것을 사용하기를 바랍니다.

    import re
    from django import template
    from django.conf import settings
    
    numeric_test = re.compile("^\d+$")
    register = template.Library()
    
    def getattribute(value, arg):
    """Gets an attribute of an object dynamically AND recursively from a string name"""
        if "." in str(arg):
            firstarg = str(arg).split(".")[0]
            value = getattribute(value,firstarg)
            arg = ".".join(str(arg).split(".")[1:])
            return getattribute(value,arg)
        if hasattr(value, str(arg)):
            return getattr(value, arg)
        elif hasattr(value, 'has_key') and value.has_key(arg):
            return value[arg]
        elif numeric_test.match(str(arg)) and len(value) > int(arg):
            return value[int(arg)]
        else:
            #return settings.TEMPLATE_STRING_IF_INVALID
            return 'no attr.' + str(arg) + 'for:' + str(value)
    
    register.filter('getattribute', getattribute)
    
  7. from https://stackoverflow.com/questions/844746/performing-a-getattr-style-lookup-in-a-django-template by cc-by-sa and MIT license