Django - 使用基于类的视图发送电子邮件

时间:2016-09-15 15:43:52

标签: django

我一直在制作一个包含listview和formview的网站。我有一个form.py,看起来像这样:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(required=True)                   
    email = forms.EmailField(required=True)
    message = forms.CharField(required=True)

和views.py:

from django.shortcuts import render
from .forms import ContactForm
from django.views.generic import ListView
from django.views.generic.edit import FormMixin
from blog.models import Post
from django.core.mail import EmailMessage

class PostListAndFormView(FormMixin,ListView):
    queryset = Post.objects.all().order_by("-date")[:2]
    template_name = 'personal/index.html'
    form_class = ContactForm
    success_url = 'personal/index.html'

此视图还处理您可以忽略的Listview功能。

我的HTML模板是:

<form action="/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="SEND MESSAGE" />   
</form>

最后是urls.py:

from django.conf.urls import url,include
from . import views
from homepage.views import PostListAndFormView

urlpatterns = [
    url(r'^$', PostListAndFormView.as_view(), name='PostListAndFormView'),
]

我想在这里做的是从表单中获取数据并使用输入的数据向我的地址发送电子邮件。有人帮我这样做。

2 个答案:

答案 0 :(得分:1)

看看at the documentation,检查FormMixin的方法并选择适合的方法。

$ heroku auth:token可能是一种选择。

在python3中

form_valid()

使用基于类的视图时,这是一种非常常见的方法。它们通常提供一堆属性和方法 - 有时只需更改一些属性即可改变方法的行为(例如def form_valid(self, form): # do your stuff # call the parents class method return super().form_valid(form) )。但通常你需要覆盖一些方法。在这种情况下阅读他们的代码总是一个好主意,因为你需要决定是否要在开头,结尾处调用mixins实现(如示例中所示),或者如果你真的想要覆盖它并提供他们自己的逻辑......

答案 1 :(得分:1)

不知道为什么要将listview与formview混淆。从你的模型,它是一个博客应用程序。通常在博客应用中,文章/帖子列表页面不包含任何带有电子邮件字段的表单,除了文章详细信息或“联系我们”页面。我更喜欢将它分成不同于使用mixin的类。

我的答案基于Daniel Greenfeld的例子here,稍加修改。

在yourapp / forms.py中:

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
import floppyforms as forms

class ContactForm(forms.Form):

    name = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    subject = forms.CharField(required=True)
    message = forms.CharField(widget=forms.Textarea)

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.add_input(Submit('submit', 'Submit'))
        super(ContactForm, self).__init__(*args, **kwargs)

在yourapp / views.py中:

from django.views.generic.list import ListView
from django.views.generic.edit import FormView
from django.conf import settings
from django.core.mail import send_mail
from yourapp.models import Post
from yourapp.forms import ContactForm

class PostListView(ListView):

model = Post

def get_context_data(self, **kwargs):
    context = super(ArticleListView, self).get_context_data(**kwargs)
    context['latest_articles'] = Post.objects.all()[:5]
    return context    

class ContactFormView(FormView):

form_class = ContactForm
template_name = "myapp/email_form.html"
success_url = '/email-sent/'

# this is what you want
def form_valid(self, form):
    message = "{name} / {email} said: ".format(
        name=form.cleaned_data.get('name'),
        email=form.cleaned_data.get('email'))
    message += "\n\n{0}".format(form.cleaned_data.get('message'))
    send_mail(
        subject=form.cleaned_data.get('subject').strip(),
        message=message,
        from_email='contact-form@myapp.com',
        recipient_list=[settings.LIST_OF_EMAIL_RECIPIENTS],
    )
    return super(ContactFormView, self).form_valid(form)