2016-09-15 62 views
0

我一直在制作一个包含listview和formview的网站。我有一个form.py它看起来像这样:Django - 使用基于类的视图发送电子邮件

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' 

这一观点也与列表视图的功能,你可以忽略交易。

我的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'), 
] 

我想在这里做的是从形式上采取的数据和发送电子邮件到我的地址输入数据。有人帮我做到这一点。

+0

你应该解释在什么地方你遇到麻烦。 –

+0

@DanielRoseman这段代码没有带来任何错误....我所要做的就是在views.py中添加代码(我认为它是在views.py中完成的),以便将表单中的有效数据发送到电子邮件地址 – Ishan

+0

好吧,但正如我所说,你尝试了什么,你在哪里遇到问题? SO不是代码写入服务。 –

回答

1

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

form_valid()可能是一个选项。

在python3

def form_valid(self, form): 
    # do your stuff 
    # call the parents class method 
    return super().form_valid(form) 

使用基于类的观点时,这是一个相当普遍的做法。它们通常会提供一堆属性和方法 - 有时只需更改某些属性即可,这些属性会改变方法的行为(例如success_url)。但通常你需要重写一些方法。在这种情况下阅读代码总是一个好主意,因为您需要决定是否要在开始,结束时(如示例中)调用mixins实现,或者如果您真的想覆盖它并提供他们的逻辑在你自己的...

1

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

我的答案基于丹尼尔格林菲尔德的例子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='[email protected]', 
     recipient_list=[settings.LIST_OF_EMAIL_RECIPIENTS], 
    ) 
    return super(ContactFormView, self).form_valid(form)