2010-01-12 35 views
7

Hepimizin bildiği (veya should), e-posta organları işlemek için Django şablon sistemini kullanabilirsiniz gibi:Eposta çiftleşmiş

def email(email, subject, template, context): 
    from django.core.mail import send_mail 
    from django.template import loader, Context 

    send_mail(subject, loader.get_template(template).render(Context(context)), '[email protected]', [email,]) 

Bu zihnimde bir kusur vardır: Bir konusunu ve içeriğini düzenlemek için e-posta, hem görünümü hem de şablonu düzenlemelisiniz. Yönetici kullanıcılara şablonlara erişmeyi haklı çıkarabildiğim halde, onlara ham python'a erişim vermiyorum!

postada yer blokları belirtebilirsiniz ve E-posta gönderdiğinizde bunları ayrı ayrı çekin eğer gerçekten harika olurdu Ne:

{% block subject %}This is my subject{% endblock %} 
{% block plaintext %}My body{% endblock%} 
{% block html %}My HTML body{% endblock%} 

Ama bunu nasıl yapardınız? Bir seferde sadece bir blok oluşturmaya nasıl başladınız?

cevap

11

Bu benim üçüncü çalışma yinelem.

{% block subject %}{% endblock %} 
{% block plain %}{% endblock %} 
{% block html %}{% endblock %} 

Ben varsayılan olarak bir liste gönderiyor e-posta yineleme için refactored ettik ve tekli ve çoklu yarar tek e-postaya göndermek için yöntemler ve django.contrib.authUser s (vardır: İster bir e-posta şablonu şöyle olduğunu varsayarak). Belkide belki de ihtiyacım olandan daha fazlasını yapıyorum ama sen gidiyorsun.

Ayrıca Python-love ile tepeye çıkmış olabilirim.

def email_list(to_list, template_path, context_dict): 
    from django.core.mail import send_mail 
    from django.template import loader, Context 

    nodes = dict((n.name, n) for n in loader.get_template(template_path).nodelist if n.__class__.__name__ == 'BlockNode') 
    con = Context(context_dict) 
    r = lambda n: nodes[n].render(con) 

    for address in to_list: 
     send_mail(r('subject'), r('plain'), '[email protected]', [address,]) 

def email(to, template_path, context_dict): 
    return email_list([to,], template_path, context_dict) 

def email_user(user, template_path, context_dict): 
    return email_list([user.email,], template_path, context_dict) 

def email_users(user_list, template_path, context_dict): 
    return email_list([user.email for user in user_list], template_path, context_dict) 

Her zaman olduğu gibi, bunu geliştirebilirseniz, lütfen yapın.

+0

Eh & * $ # Bırak kaçan metni önlemek için autoescape kapatmak için bulunmuştur. İşe yarıyor. Ad/ad/yanıtlama ayarlarının yapılmasına izin vermek için tabana daha fazla alan eklemeyi düşünerek. – Oli

+0

Hah, bunu bir PITA olan üç farklı şablonla yapıyorum. Benden kesin +1! –

+0

Bunu beğendim. Her zaman sadece iyi şablonlar kullandım, bu da iyi çalışıyor, ama bununla başa çıkmak çok daha güzel (özellikle de genellikle tüm şablonlar için aynı bağlamı istediğinizden). –

0

Sadece iki şablon kullanın: biri gövde ve konu için bir tane.

{% extends "base.txt" %} 

{% if subject %}Subject{% endif %} 
{% if body %}Email body{% endif %} 
{% if html %}<p>HTML body</p>{% endif %} 

Şimdi şablon üç kez işlemek zorunda, ama miras düzgün çalışır: Ben şablon devralma {% body %} etiketlerini kullanarak çalışmak için alamadım

+0

aracılığıyla buldum. İki dosya, esasen aynı şey için iki dosya adı anlamına gelir. O, arkadaki pek çok şablon üzerinde durmak zorunda kalan bir acı. – Oli

0

, bu yüzden böyle bir şablona geçti.

c = Context(context, autoescape = False) 
subject = render_to_string(template_name, {'subject': True}, c).strip() 
body = render_to_string(template_name, {'body': True}, c).strip() 
c = Context(context, autoescape = True) 
html = render_to_string(template_name, {'html': True}, c).strip() 

Ben de HTML dışı metin oluşturulurken gerekli e-posta

İlgili konular