テンプレートレイヤーでアクセスできるミドルウェアクラスの1つに変数を設定するのに問題があるようです。
基本的なレイアウトは次のとおりです。
class TheMiddleware(object):
def __init__(self, etc):
stuff...
def process_response(self, request, response):
request.my_var = "whatever"
return response
次に、別のビューのテンプレートで、次のようにします。
{% custom_tag arg_a %}
これは、リクエストから変数を返す必要があるテンプレートタグです。
@register.simple_tag
def custom_tag(arg_a):
return threading.currentThread().request.my_var
これは、「レンダリング中にAttributeErrorをキャッチしました:'WSGIRequest'オブジェクトに属性'my_var'がありません」でエラーになります。
テンプレートタグのリクエストにアクセスする方法かもしれないと思いました。そこで、この質問のようにdjango.core.context_processors.requestをTEMPLATE_CONTEXT_PROCESSORSに追加し、リクエストオブジェクトをタグに渡して、テンプレートから直接リクエストにアクセスしようとしましたが、運がありませんでした。
リクエストオブジェクトがどのように機能するかについての理解が不足していると思います。変数をリクエストオブジェクトに割り当て、その変数をいくつかのビューで取得することは可能ですか?リクエストオブジェクトがビューを通過したと思いましたが、代わりに新しいインスタンスが生成されたようです。
その場合、ビューまたはテンプレートのいずれの場合でも、アプリの任意のポイントからアクセスできるミドルウェア内にグローバル変数を格納するにはどうすればよいでしょうか。
更新:
混乱を解消するために(私のものか他の人かはわかりません!)、ビューのprocess_responseミドルウェアでリクエスト変数を設定してから、同じビューのテンプレートでそれを取得しようとはしていません。変数が保存される前にテンプレートが処理されているため、これは機能しないことを理解しています。(これは私の側の意図的な行為です)。
view1とview2の2つのビューがあります。1つには、ミドルウェアにリクエストの変数を設定させるデコレータがあります。変数にアクセスしたいのは、変数が設定された後に来るview2テンプレートです。