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

Ish*_*han 3 django

我一直在制作一个包含列表视图和表单视图的网站。我有一个 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)
Run Code Online (Sandbox Code Playgroud)

和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'
Run Code Online (Sandbox Code Playgroud)

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

我的 HTML 模板是:

<form action="/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="SEND MESSAGE" />   
</form>
Run Code Online (Sandbox Code Playgroud)

最后是 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'),
]
Run Code Online (Sandbox Code Playgroud)

我想要做的是从表单中获取数据,并将包含输入数据的电子邮件发送到我的地址。有人帮我做这件事。

geo*_*ars 5

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

我的回答基于 Daniel Greenfeld 的示例,稍加修改。

在 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)
Run Code Online (Sandbox Code Playgroud)

在 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)       
Run Code Online (Sandbox Code Playgroud)