【问题标题】:Django sends emails twice after form submission表单提交后 Django 发送两次电子邮件
【发布时间】:2019-09-20 12:37:08
【问题描述】:

我试图在我的应用程序中提交表单时发送电子邮件,我设法做到了,但由于某种原因,它每次发送两次。 经过一番搜索和调试,我想我知道问题出在哪里,但我不知道为什么。

所以我的应用程序的电子邮件发送功能发生在我的表单中。 py 看起来像这样:

class approvalForm(forms.ModelForm):
    text1 = forms.ModelChoiceField(disabled = True, queryset = Visit.objects.all())
    text2 = forms.ChoiceField(disabled = True, choices = poolnumber)

def save(self, commit=False):
      instance = super(approvalForm, self).save(commit=commit)
      ready = instance.visible
      if ready is True:
        self.send_email()
        print('yay sent')
      else:
          None
      return instance

def send_email(self):
    var = self.cleaned_data
    tomail = self.cleaned_data.get('visit')
    tomails = tomail.location.users.all()
    tomaillist = []
    for item in tomails:
        tomaillist.append(item.email)
    print(tomaillist)
    msg_html = render_to_string('myapp/3email.html', {'notify': var})
    msg = EmailMessage(
          'Text here',
          msg_html,
          'myemail@email.com',
          tomaillist,
          headers={'Message-ID': 'foo'},
       )
    msg.content_subtype = "html"
    print("Email sent")
    msg.send() 


class Meta:
    model = MyModels
    fields = ('text1','text2', )

save() 函数运行了 2 次。我尝试将电子邮件发送功能移动到 form_valid() 函数中的 views.py,但它从未被调用,所以我尝试了 form_invalid() 但结果相同。

有什么办法不让 save() 函数运行 2 次?还是因为我的代码有错误?

【问题讨论】:

  • 您正在节省instance 2 次​​span>

标签: django django-forms django-email


【解决方案1】:

当覆盖 save() 方法时,你应该在最后调用 super()。

此外,在有效保存您的实例之前,仅应使用覆盖此方法来添加对其他事物的一些检查。在这里,我看到您在实例上执行了 save() ..在 save() 方法中。

您的实例上的有效 save(),这里是 'self',应该只通过 super() 执行一次

并且在覆盖 save() 时无需返回任何内容。只需使用 super() 完成,一切都会好起来的。

【讨论】:

  • 另外:为什么不提交(默认)通过 super().save() 检索实例?为什么你有一个“其他:无”? “if ready is True:”可以写成:“if ready:”
【解决方案2】:

尝试将您的 save() 方法更改为:

def save(self, commit=True):  # declaration matches the method you are overriding
    instance = super(approvalForm, self).save(commit=False)
    ready = instance.visible
    if ready:   # no need to include is True
       self.send_email()
    if commit:
        instance.save()

【讨论】:

  • 这解决了问题,谢谢!现在在控制台中我只看到一个打印件!但它也给了我一个错误:“NoneType”对象没有属性“dict”。我不确定这意味着什么
  • @VendelUtto 如果它解决了您的问题,请考虑将其标记为已接受。您遇到的另一个问题似乎与其他问题有关。
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2014-06-24
相关资源
最近更新 更多