, 그것은 템플릿을 사용하는 딕셔너리를 반환 할 수 있습니다TurboGears2의 데코레이터로 템플릿에 사용되는 dict에 vars를 삽입하는 방법은 무엇입니까? 메소드가 노출되면
class RootController(TGController):
@expose('myapp.templates.index')
def index(self):
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
self.selected = "item1"
return dict(mykey=self.mykey, mymenu=self.mymenu, selected=self.selected)
이 코드는 잘 작동합니다. 이제 메뉴 보일러 플레이트를 다음과 같은 데코레이터로 캡슐화하려고합니다.
class RootController(TGController):
@expose('myapp.templates.index')
@menu()
def index(self):
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
self.selected = "item1"
return dict(mykey=self.mykey)
그러나이 메뉴 데코레이터를 작성하는 방법을 모르겠습니다. 내가 사용하는 경우 :
는def before_render_cb(remainder, params, output):
return output.update(dict(mymenu=["item1", "item2", "item3"], selected="item1"))
class RootController(TGController):
@expose('myapp.templates.index')
@before_render(before_render_cb)
def index(self):
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
self.selected = "item1"
return dict(mykey=self.mykey)
은 내가 사용하는 경우
mymenu에서 나온을 추가하고 DICT로 선택하지만 난 컨트롤러의 인스턴스 속성에 액세스 할 수 없습니다 (self.mymenu 및 self.selected)합니다 데코레이터 :
class menus(object):
def __call__(self, func):
deco = Decoration.get_decoration(func)
return func
내가 장식에 액세스 할 수 있지만 내가 어떻게 할 수있는 노출 객체도 컨트롤러
할 수 있습니까? , 장식 도청 데이터를 전송
#---=== read this section second: ===---
def make_menu_from_controller(remainder, params, output):
controller = output.pop('controller') #Here we remove RootController sent by "index" and write it to "controller" variable.
#Only {'page':'index'} left inside "output" variable
return output.update(dict(mykey=controller.mykey, mymenu=controller.mymenu, selected=controller.selected)) #here we update dict adding "mykey", "mymenu" and "selected" keys.
#---=== read this section first: ===---
class RootController(TGController):
def __init__(self): #here we initiate variables, which are not changed during surfing
self.mykey = "foo"
self.mymenu = ["item1", "item2", "item3"]
@expose('myapp.templates.index')
@before_render(make_menu_from_controller)
def index(self):
self.selected = "item1"
return dict(page='index', controller=self) #RootController sends itself
당신이 볼 수 있듯이, "before_render"그것은 작동합니다 : 당신의 도움이
로랑 여기