Django - context_processors

时间:2016-03-15 21:33:04

标签: django django-templates django-registration django-email

我正在尝试使用context_processors将一些配置从settings.py转换为我的模板。

我创建了一个这样的文件:

from django.conf import settings
def my_custom_var (request):
    return {'MY_CUSTOM_VAR': settings.`MY_CUSTOM_PROP`}

这是我在settings.py上的模板配置:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.template.context_processors.i18n',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'my_app.py_file.my_custom_var',
        ],
    },
},]

当我尝试使用{{MY_CUSTOM_VAR}}时,在我的html模板上,一切正常。但是当我尝试在电子邮件密码重置模板(django / contrib / admin / templates / registration / password_reset_email.html)上使用它时,MY_CUSTOM_VAR的值为空。

这是我的password_reset_email.html:

{% load i18n %}{% autoescape off %}
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

MY_CUSTOM_VAR: {{ MY_CUSTOM_VAR }}

{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}

{% trans "Thanks for using our site!" %}
{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
{% endautoescape %}

任何人都知道错了吗?还有另外一种方法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

罪魁祸首是send_mail类的PasswordResetForm方法。在这里,render_to_string用于构建电子邮件正文:

class PasswordResetForm(forms.Form):
    def send_mail(self, ...):
        # ...
        body = loader.render_to_string(email_template_name, context)
        # ...

如果您希望它通过上下文处理器,则需要使用PasswordResetForm的自定义子类,您可以在其中覆盖send_mail方法并为render_to_string提供其他关键字参数context_instance必须是RequestContext个实例:

        body = loader.render_to_string(
            email_template_name, context,
            context_instance=RequestContext(request)
        ) 
        # you might have to pass the request from the view 
        # to form.save() where send_mail is called

这适用于所有模板渲染。只有RequestContext个实例通过上下文处理器。