Электрондық пошта мекенжайы өзгерген кезде электрондық хаттарды жіберу

Менің DJango қосымшасында менің jmodel жүйесіндегі email өрісі MyModel өзгерген кезде, жүйені енгізгім келеді, сол электрондық пошта электрондық пошта мекенжайына жіберіледі. Менде бұл үлгіде ModelForm бар. Мұны қалай және қалай жүзеге асыруға болады?

  1. Модель формамның save() әдісін алдын ала жіктеуім керек пе?
  2. Мен тырысып көріңіз және тырысыңыз моего моделі жаңартылған сигнал және электрондық пошта жіберіңіз жерде - егер солай болса, қалай?
  3. дегенді қандай сигналға аударамын?

Электрондық поштаның өзгергенін тексерудің жақсы жолы қандай? Бұл өздігінен жүзеге асырылатын маңызды нәрсе, бірақ кодексті оның тұрғылықты жері болуын қалаймын.

Рахмет

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

2
1-ші нұсқа модельге тым көп мінез-құлық әкеледі: электрондық поштаны жіберу бұл оқиғаның қосалқы өнімі болып табылады, бірақ бұл модель білімді қажет етеді. Оқиғалар жасау және хабарландыруды қабылдау үшін, django-сигналдары пайдалана аласыз. мұндай мінез-құлық.
қосылды автор wkl, көзі

2 жауаптар

Қосымша дерекқор іздеуінсіз мұны істеу үшін django-model-changes пайдалануыңызға болады:

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
қосылды

Мен сілтеме жасалынған СӨ мәселесінің ұстанымын ұстанатын едім. Онда 18 жаңғыртулар болды, бірақ бәрі де емес. Шындығында, бұл жай ғана ақпараттар (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, көзі
Сәлеметсіз бе, Крис, мен оны іске асырдым және аздап мәселе қойдым. Электрондық поштаны жаңа электрондық пошта мекенжайына жіберуге болады, бірақ DB-дегі электрондық пошта өрісін жаңартпайды, яғни ескі электрондық пошта мекенжайын қайтадан DB-ге сақтауды қалаймын. (Көптеген адамдар түсініктемелерде сұрақтар қоюды ұнатпайтынына сенімдімін, бірақ мен мұның бәрін істеуге тырысып жүргеніммен тікелей байланысты деп ойладым, сондықтан осы жерден сұрауға тиіспін). Рахмет Крис.
қосылды автор Mridang Agarwalla, көзі
@MridangAgarwalla Менің жауапымды сіз өзіңіз қалаған нәрсені орындауға бейімдеуіңізге болады: save дегенді ауыстырыңыз және өзіңіздің электрондық поштаңыздың өзгергенін білу үшін қоңырау шалуыңызға болады, егер ол сізді super (MyModel, self) .save()
қосылды автор Robert Kajic, көзі