Адпраўка паведамленні электроннай пошты, калі адрас электроннай пошты зменены

У маім дадатку Django Я хацеў бы ўкараніць сістэму так, што калі электронная пошта поле ў маім JModel, MyModel змяняецца, адпраўляецца паведамленне электроннай пошты на гэты адрас электроннай пошты. У мяне ёсць ModelForm на гэтай мадэлі шахты. Якім чынам і як я павінен гэта рэалізаваць?

  1. Ці павінен я перавызначыць захаваць() метад майго ModelForm і адправіць электронную пошту там?
  2. Ці павінен я паспрабаваць і паспрабаваць пастку нейкае мадэль абноўленага сігналу і адправіць электронную пошту там - калі так, то як? Які сігнал shoudl я б ўлоўліваць?

Што такое добры спосаб праверыць, што электронная пошта была змененая. Гэта само па сабе з'яўляецца трывіяльная рэч, каб рэалізаваць, але я хацеў бы код, каб пражываць яе гэта законнае месца.

дзякуй

Checking if a field was changed: Django: When saving, how can you check if a field has changed?

2
Варыянт 1 будзе пара занадта шмат паводзін мадэлі - адпраўка па электроннай пошце, з'яўляецца пабочным прадуктам гэтай падзеі адбываецца, але гэта не паводзіны мадэлі патрабуецца веданне. Вы можаце выкарыстоўваць Джанго-сігналы , каб стварыць падзеі і наладзіць абвесткі для прымачоў гэты від паводзін.
дададзена аўтар wkl, крыніца

2 адказы

Вы можаце выкарыстоўваць Джанго-мадэль-змены , каб зрабіць гэта без дадатковага пошуку ў базе даных:

from django.db import models
from django.dispatch import receiver
from django_model_changes import ChangesMixin

class MyModel(ChangesMixin, models.Model):
   # your model

@receiver(pre_save, sender=MyModel)
def send_email_if_changed(sender, instance, **kwargs):
    if 'email' in instance.changes():
        # send email
2
дададзена

Я б не прытрымлівацца радам спасылкавага SO пытанне. Ён атрымаў 18 upvotes, але здавалася б upvotes не ўсе;). На самай справе, гэта, верагодна, толькі ад інфо (2009).

Гэта значна лепш выкарыстоўваць pre_save сігнал, каб зрабіць гэта, што патрабуе абсалютна <ет> нуль змены ў мадэлі і, такім чынам, не маюць якіх-небудзь негатыўных наступстваў, такіх, як адказ ваш спасылка мае ,

Па сутнасці, у метадзе прымача, вы паглядзіце на асобнік аб'екта з базы дадзеных. Так як гэта папярэдне захаваць, база дадзеных яшчэ не былі змененыя. У выніку, вы можаце параўнаць instance.some_field з obj.some_field і паглядзець, калі яны розныя.

@receiver(pre_save, sender=MyModel)
def send_email_if_changed(sender, instance, **kwargs):
    try:
        obj = MyModel.objects.get(pk=instance.pk)
    except MyModel.DoesNotExist:
        pass # It's new, so email hasn't technically changed, but you might want to do something else here.
    else:
        if not obj.email == instance.email: # Email has changed
            # send email
1
дададзена
Не, я не думаю, што гэта магчыма. Сігналы не праходзяць нічога назад. Яны проста робяць рэчы, заснаваныя на каштоўнасцях, яны даюць. Але, сітуацыя вы апісваеце, здаецца, прымудрыўся так ці інакш. Зменіце пытанне з інфармацыяй пра тое, што вы на самай справе спрабуеце дасягнуць.
дададзена аўтар Chris Pratt, крыніца
Прывітанне Крыс, я рэалізацыя гэтага і быў невялікая праблема. Ці можна адправіць па электроннай пошце на новы адрас электроннай пошты, але не абнаўляць поле электроннай пошты ў БД гэта значыць я хачу, каб захаваць стары адрас электроннай пошты назад у БД. (Я ведаю, што многія людзі не любяць людзей задаваць пытанні ў каментарах, але я адчуваў, што гэта непасрэдна звязана з тым, што я спрабаваў зрабіць, і таму я павінен спытаць тут.) Дзякуй Крыс.
дададзена аўтар Mridang Agarwalla, крыніца
@MridangAgarwalla Вы можаце адаптаваць свой адказ, каб зрабіць тое, што вы хочаце: перавызначыць захаваць і выклікаць self.changes (), каб убачыць, калі адрас электроннай пошты змянілася, калі ён зрабіў, вы можаце прапусціць выклік супер (MyModel, самастойна) .save()
дададзена аўтар Robert Kajic, крыніца