我一直在制作一个包含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'),
]
我想在这里做的是从表单中获取数据并使用输入的数据向我的地址发送电子邮件。有人帮我这样做。
答案 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)