我正在利用django-registration与我在Github上找到的一组预制模板进行两步(注册 - 激活)工作流程using HMAC。
我想将全局变量(在上下文处理器中定义),例如我的网站名称传递给django-registration发送的电子邮件。例如,发送给新注册人的激活电子邮件或密码更改一个。
"问题"我是不是可以直接访问这些观点。这有点django-registration,你在urls.py
文件中包含它的路径,一切正常:
urlpatterns = [
url(r'^', include('core.urls')),
url(r'^admin/', admin.site.urls),
url(r'^accounts/', include('registration.backends.hmac.urls')),
]
为这些视图添加上下文的最小努力方式是什么?我已经创建并成功passing context to emails in my own views(使用上下文处理器):
def send_some_email_view(request):
msg_plain = render_to_string('email_change_email.txt', context, request=request)
msg_html = render_to_string('email_change_email.html', context, request=request)
但是我没有创造的观点呢?
编辑:所以我取得了一些进展,找到了django-registration的注册视图,以及其中的这个方法:
def send_activation_email(self, user):
"""
Send the activation email. The activation key is simply the
username, signed using TimestampSigner.
"""
activation_key = self.get_activation_key(user)
context = self.get_email_context(activation_key)
context.update({
'user': user
})
subject = render_to_string(self.email_subject_template,
context)
# Force subject to a single line to avoid header-injection
# issues.
subject = ''.join(subject.splitlines())
message = render_to_string(self.email_body_template,
context)
user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
我不想在源代码中覆盖它,因为这会阻止我更新。所以现在问题变成了:我唯一的出路是编写一个视图,这个视图是否继承了这个视图,并覆盖了这个方法?这意味着我正在为需要发送电子邮件的django-registartion提供的每个视图编写单独的视图...
答案 0 :(得分:1)
首先根据供应商视图创建自己的视图,并覆盖所需的方法:
private toggle: boolean = attr.isFirst;
public toggleContract() {
this.toggle = !this.toggle;
}
比看from registration.backends.hmac.views import RegistrationView
class CustomRegistrationView(RegistrationView):
def get_email_context(self, user):
context = super().get_email_context(user)
return RequestContext(self.request, context)
(source)。他们只是在那里定义了一堆网址。
您可以通过添加自己的 轻松覆盖其中一个,其中包含应用中的一个。
registration.backends.hmac.urls.py
在更改必要的内容时,您还可以了解第三方应用中的最新情况,这始终是一个优势。这适用于大多数第三方应用,而不仅仅是您当前使用的应用。
答案 1 :(得分:0)
这是我最终做的事情,感谢dahrens'回答发给我:
# myapp/processors.py
def get_website_name(request):
website_name = 'ExcitingWebsiteThatsComingSoon'
return {'mysite_name': website_name}
# some views.py file
from myapp.processors import get_website_name
class RegistrationViewWithContext(RegistrationView):
def get_email_context(self, user):
context = super().get_email_context(user)
context['req'] = get_website_name(self.request)
return context
基本上,我只是使用我的自定义处理器来注入网站的名称。它并不像我希望的那样干净:在我的模板中,我可以简单地使用{{ mysite_name}}
,在电子邮件模板中我必须使用{{req.mysite_name}}
。但这确实有我想要的DRY:如果函数中的变量发生变化,所有模板都会相应地更新。
我现在将答案标记为正确,如果有任何新答案,我会相应更新。