2014-12-29 2 views
2

나는이 패턴을 구현하는 사람을 아직 보지 못했고 기술적으로 실용적이라면 배우기를 열망합니다.사용자 지정 필터가없는 템플릿에서 모델 인스턴스에 액세스

이 예제에서 "get_widget"필터는 이름 또는 키가 첫 번째 인수로 전달 된 MyWidget 객체를 검색합니다.

템플릿 논리

{% get_widget "whizbang" as item %} 
<h1>{{item.name}}</h1> 

{% get_widget "1234" as item %} 
<h1>{{item.name}}</h1> 

사용자 정의 필터

@register.assignment_tag(takes_context=True) 
def get_widget(context, widget_name): 

    try: 
     return MyWidget.objects.get(name=widget_name) 
    except MyWidget.DoesNotExist: 
     return None 

그러나 오히려 끔찍한 보인다.

예 : 그 이름이 키의 사용, 또는, "whizbang"인 또는 기반으로 MyWidget의 인스턴스를 검색 내가보고 싶은 무엇

좀 더 dyanmic 무언가이다.

<h1>{{MyWidget.whizbang}}</h1> 
<h1>{{MyWidget.1234}}</h1> 

질문은 두 가지이다 : 템플릿에서

  1. IT는 request_context
  2. 에 싱글/공장에서 통과 할 수있을 것인가는 "차단"에 파이썬 메커니즘이 메소드가 실행되기 전에 호출하고 해석하십시오.

답변

0

파이썬 문서를 살펴본 후 __getattrr__()의 조합처럼 보이고 클래스 이름을 전달하는 것이 모두 필요합니다. 내 질문에 대답 해줘서 사과합니다. 희망적으로 이것은 다른 누군가에게 유용 할 것입니다.

템플릿

{{ Menus.HeyDude.DoSomething }} 

클래스

from mycode import Menu 
class MenuFactory(): 
    def __getattr__(self, name): 
     try: 
      return Menu.object.get(name=name) 
     except Menu.DoesNotExist: 
      raise AttributeError 

Middlewear 컨텍스트 프로세서

from mycode import MenuFactory 
def context_processor(request): 

    return_val = {} 

    # Add all of the factories 
    return_val['Menus'] = MenuFactory 
    return return_val 
관련 문제