2016-09-06 20 views
1

電子メールを送信する関数を作成していますが、電子メールのHTMLテンプレート内でcontext_processor変数を使用する必要がありますが、これは機能しません。render_to_stringメソッドのDjangoカスタムコンテキストプロセッサー

例:私のカスタムcontext_processor.py

def send_email(plain_body_template_name, html_body_template_name): 
    plain_body = loader.render_to_string(plain_body_template_name, context) 
    html_body = loader.render_to_string(html_body_template_name, context) 
    email_msg = EmailMultiAlternatives(body=plain_body) 
    email_msg.attach_alternative(html_body, 'text/html') 
    email_message.send() 

私はちょうどHttpRequestを受け取り、{'foo': 'bar'}のような辞書を返す機能を持っており、テンプレートに私が{{foo}}を使用してレンダリングしてみてください。

TEMPLATE['OPTIONS']['context_processors']にcontext_processorも追加しました。

答えて

3

あなたがするのではなく、あなたの辞書をラップする

'BACKEND': 'django.template.backends.django.DjangoTemplates',

Djangoはあなたが要求で渡されていないことを見て、基本的なContextを選ぶされて、あなたのTEMPLATEdjangoバックエンドを使っていると仮定すると、あなたが定義したcontext_processorsを処理するRequestContext

おそらくhtml_body = loader.render_to_string(html_body_template_name, context, request=request)

をやって逃げることができますが、リクエストオブジェクトに渡す必要があると思います。

これは意味がないかもしれません。あなたはその人にメールをしていますか?文脈に含めるのが理にかなっていますか?

コンテキストプロセッサにrequestが必要ない場合は、単純なユーティリティ関数(ここでしか呼び出されていない場合)を作成するか、リクエストパラメータをオプションにしてこのモジュールにインポートし、コンテキスト

context = {"my_var": 1} context.update(your_extra_context()) loader.render_to_string(...)

は、層内のContext()を更新するいくつかの複雑な方法がありますが、私はそれはここでは必要ないと思います。

+0

ありがとう@ user3208419この特定のケースでは、リクエストは必要ありません。あなたの解決方法に従って 'context'パラメタを自分の' context_processors'で更新し、 'template ['OPTIONS'] ['context_processors']'を 'request' paramを持つ別のテンプレートに保存しました。 –

1

私は同様の問題がありました - テンプレートをコンテキストプロセッサの値で文字列にレンダリングする必要がありましたが、同時に要求オブジェクトはNone(コンソールからのコマンド実行)でした。あなたの代わりに辞書のRequestContextを渡すとき

from django.template.loader import render_to_string 
from django.template import RequestContext 
from django.shortcuts import render 

def index(request): 
    if not request: 
     context = {'param1':'value1'} 
     return render_to_string('myapp/index.html', RequestContext(None, context)) 
    else: 
     #render as usual 
     render(request, 'myapp/index.html', context) 
     pass 

が、それはコンテキストにすべてのコンテキストプロセッサの値を取り込みます。そして、私はこのアプローチを見つけました。しかし、リクエストはすべてのコンテキストプロセッサでオプションでなければなりません。そうしないと動作しません。

関連する問題