Django 在表单提交后发送电子邮件两次



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

因此,我的应用程序的电子邮件发送功能发生在我的表单中.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 次?还是因为我的代码中的一些错误?

当重写 save(( 方法时,你应该在最后调用 super((。

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

实例上的有效 save((,此处为"self",应仅通过 super(( 执行一次

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

尝试将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()

最新更新