#django #email #dry
#django #Адрес электронной почты #сухое
Вопрос:
У меня есть следующие два блока кода во МНОГИХ моих представлениях. Я ищу способ абстрагировать их, чтобы вместо повторения этого кода в каждом представлении. Получатель, строка темы и тело, конечно, будут отличаться, поэтому я хотел бы иметь возможность передавать эти строки в эту функцию — «функция» — правильный термин для использования, верно?
mailt = loader.get_template('membership/signup_email.txt')
mailc = Context({
'signin_url': signin_url,
'name': firstname ' ' lastname,
'username': username,
'membership_level': membership_level.name,
'membership_number': membership_number,
'payment_plan': payment_plan
})
msg = EmailMessage(
'You are now a Member!',
mailt.render(mailc),
'membership@domain.org',
[email]
)
msg.content_subtype = "html"
msg.send()
# Nofity our staff
admin_mailt = loader.get_template('membership/signup_admin_email.txt')
admin_mailc = Context({
'site': current_site,
'user': user,
'payment_plan': payment_plan
})
admin_msg = EmailMessage(
'[myproject] New Membership Signup',
admin_mailt.render(admin_mailc),
'membership@domain.org',
['membership@domain.org']
)
admin_msg.content_subtype = "html"
admin_msg.send()
Ответ №1:
Я не уверен, откуда берутся все ваши переменные … но …. не могли бы вы просто создать функцию, скажем, в utils.py ? Поместите туда приведенный выше код и при необходимости вызовите его с параметрами. Итак, ваши представления могут иметь что-то вроде следующего. Вызов функции, созданной вами в другом месте.
custom_send_mail(recipient, subject, body)
Ответ №2:
Вы могли бы использовать встроенные в django методы электронной почты и немного абстрагироваться от них, чтобы получить то, что вы хотите, это не принесет вам так много, но вот что вы делаете.
Смотрите документацию здесь: http://docs.djangoproject.com/en/1.3/topics/email /
Вот как вы используете встроенный в django метод электронной почты.
from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)
Итак, один из ваших примеров выше превратился бы в это.
# Nofity our staff
admin_mailt = loader.get_template('membership/signup_admin_email.txt')
admin_mailc = Context({
'site': current_site,
'user': user,
'payment_plan': payment_plan
})
send_mail('[myproject] New Membership Signup', admin_mailt.render(admin_mailc), 'membership@domain.org', ['membership@domain.org'])
Вы могли бы немного изменить это, чтобы вы могли просто передать имя шаблона и контекст, и это сделало бы его немного чище.
send_my_email(subject, to_address, template, context, from_address='membership@domain.org'):
admin_mailt = loader.get_template(template)
send_mail(subject, admin_mailt.render(context), from_address, to_address)