それでも最も簡単な方法は、オブジェクトの__before_publishing_traverse__
フックを使用することです。members
from zExceptions import Redirect
def __before_publishing_traverse__(self, object, request):
stack = request.TraversalRequestNameStack
if len(stack) > 1 and stack[-2] == 'view':
try:
self.request.form['member_id'] = stack.pop(-1)
if not validate(self.request['member_id']):
raise ValueError
except (IndexError, ValueError):
# missing context or not an integer id; perhaps some URL hacking going on?
raise Redirect(self.absolute_url()) # redirects to `/members`, adjust as needed
このメソッドは、さらにトラバースする前にパブリッシャーによって呼び出されます。したがって、発行者はすでにmembers
オブジェクトを見つけており、このメソッドはそれ自体(object
)と要求を渡します。リクエストに応じて、トラバーサルスタックが見つかります。あなたの例の場合、それは保持さ['view', 'isaacnewton']
れ、このメソッド'isaacnewton'
はキーの下のリクエストに移動します'member_id'
(オプションの検証後)。
このメソッドが戻ると、パブリッシャーは残りのスタックを使用してトラバースを続行するため、にトラバースします。これは、リクエスト内のキーview
を期待するブラウザービューである必要があります。member_id
その後、それは仕事をすることができます:
class MemberView(BrowserView):
def __call__(self):
if 'member_id' in self.request.form: # Huzzah, the traversal worked!