【发布时间】:2016-05-12 19:34:12
【问题描述】:
我的 Django 网站上有一个联系表单,提交后会转到成功 url,但没有发送电子邮件,并且从不调用 form_valid 函数中设置的日志记录。
这是视图的代码:
class ContactView(FormView):
form_class = ContactForm
template_name = "contact.html"
success_url = "/contact-sent/"
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'))
recipients = [recipient for recipient in settings.LIST_OF_EMAIL_RECIPIENTS]
try:
send_mail(
subject=form.cleaned_data.get('subject').strip(),
message=message,
from_email='XXX@XXX.com'
recipient_list=recipients,
)
logger = logging.getLogger(__name__)
logger.info("Contact Email sent successfully")
except Exception as e:
logger = logging.getLogger(__name__)
logger.warning("Contact Email failed to send\nInfo: %s" % e)
return super(ContactView, self).form_valid(form)
还有表单,它是使用 floppyforms 和 crispyforms 的模型表单:
class ContactForm(ffuture.ModelForm):
def __init__(self, *args, **kwargs):
super(ContactForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'id-contactForm'
self.helper.form_class = 'contact-form'
self.helper.form_method = 'post'
self.helper.form_action = 'submit-feedback'
self.helper.form_tag = True
self.helper.layout = Layout(
Fieldset(
_('Contact Us'),
Field('name', placeholder=_('Name'), css_class='input-medium'),
Field('email', placeholder=_('Email'), css_class='input-xlarge'),
Field('subject', placeholder=_('Subject'), css_class='input-xlarge'),
Field('message', placeholder=_('Add a message'), rows='5', css_class='input-xlarge'),
),
)
self.helper.add_input(Submit('submit', _('Submit')))
class Meta:
model = Feedback
fields = ('name', 'email', 'subject', 'message')
和模型:
@python_2_unicode_compatible
class Feedback(models.Model):
subject = models.CharField(max_length=100)
message = models.TextField(max_length=500)
name = models.CharField(max_length=100)
email = models.EmailField()
creation_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.topic
class Meta:
verbose_name_plural = _("Feedback")
verbose_name = _("Feedback")
电子邮件永远不会发送,反馈模型永远不会在管理员中更新。
有人对为什么会发生这种情况有任何想法吗?我一直在翻阅代码并查看其他示例,但它们似乎与我所拥有的没有太大不同。我很困惑为什么它没有发送电子邮件,也没有在 form_valid 方法中调用任何日志记录。
理想情况下,我希望它将联系电子邮件发送给收件人,并将输入的信息保存到反馈模型中。
另外两件事可能相关:
该站点当前在 Apache 上运行,对于视图中设置的 from_email,我从未为其配置任何凭据。我不确定在哪里执行此操作。但即使这就是未发送电子邮件的原因,我也不明白为什么反馈模型不会更新。
感谢你们提供的任何帮助,我已经被困了一段时间了。
编辑:
我认为问题可能是 send_mail 函数,但我在 try 块上方添加了日志记录,但也没有调用它,所以我现在确定 form_valid 方法永远不会被调用。
至于未保存的反馈模型,我意识到这可能是因为我从未真正保存过表单。
我在这里有点困惑,因为我正在为联系人使用模型表单,所以提交表单的用户没有登录。目标是发送电子邮件,并将结果存储在数据库中。但我似乎无法弄清楚我应该如何在没有有效用户的情况下保存模型表单。
做就够了吗
feedback = form.save()
在 ContactView 中我的 form_valid 方法内?还是我想在我的模型表单中使用保存方法?
【问题讨论】:
-
检查
form_valid方法的缩进。在问题中看起来没问题,但是如果您在视图中弄错了,那么默认实现将立即重定向到成功 url。您的 URL 和模板可能会解释发生了什么,但如果您被重定向到正确的成功 url,那么它们可能没问题。 -
是的,我仔细检查了它,缩进与问题中的相同。