Dango отправляет электронные письма дважды после отправки формы - PullRequest
0 голосов
/ 20 сентября 2019

Я пытался отправлять электронные письма, когда в мое приложение отправляется форма, и мне удалось это сделать, но по какой-то причине он отправляет ее дважды каждый раз.После некоторого поиска и отладки я думаю, что знаю, в чем проблема, но я не знаю почему.

Таким образом, функция отправки электронной почты моего приложения выполняется в моих формах.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 раза.Я пытался переместить функцию отправки электронной почты в views.py в функцию form_valid (), но она никогда не вызывалась, поэтому я попробовал form_invalid (), но результаты те же.

Есть ли способ непозволить функции save () запускаться 2 раза?Или это из-за ошибки в моем коде?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

При переопределении метода save () вы должны выполнить вызов super () в конце.

Кроме того, переопределение этого метода следует использовать только для добавления некоторых проверок других вещей перед эффективным сохранением вашегоэкземпляр.Здесь я вижу, что вы делаете save () для instance..в методе save ().

Эффективное save () для вашего экземпляра, которое здесь имеет значение «self», должно быть выполнено только один раз через супер()

И не нужно ничего возвращать при переопределении save ().Просто закончите с супер () и все будет хорошо.

0 голосов
/ 20 сентября 2019

Попробуйте изменить 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()
...