Почему еще блок выполняется в то время как блок истинен в сигналах Django? - PullRequest
0 голосов
/ 22 апреля 2019

Я пишу функцию сигнала, которая будет отправлять пользователю электронное письмо с уведомлением о регистрации, когда он регистрируется, и электронное письмо с уведомлением об обновлении, когда он / она обновляет профиль пользователя.Для этого я использовал блок if-else для проверки параметра created.Если это правда, пользователь получит уведомление о регистрации.В противном случае пользователь получит уведомление об обновлении профиля.Он отлично работает, когда пользовательский объект обновляется.Но когда новый пользователь регистрируется, оба блока if и else выполняются, и новый зарегистрированный пользователь получает два уведомления по электронной почте: одно уведомление о регистрации и одно уведомление об обновлении профиля.Полный код сигнала приведен ниже:

#myapp/signals.py

from django.core.mail import send_mail
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.template.loader import render_to_string
from django.utils.html import strip_tags

#getting custom user model
User = get_user_model()


@receiver(post_save, sender=User)
def send_user_notification(sender, instance, created, **kwargs):
    if created:
        subject = 'Signup Notification'
        html_message = render_to_string(
            'email/signup_notification.html',
            {
                'username': instance.username,
                'email': instance.email,
            }
        )
        message = strip_tags(html_message)
        send_mail(subject, message, from_email='info@silatechnologies.com', recipient_list=[instance.email,],
                  html_message=html_message)

    else:
        send_mail(subject='Your profile on Sila Crowdfunding updated!',
                  message='Dear ' + instance.username + ', your profile information is updated successfully.',
                  from_email='info@silatechnologies.com',
                  recipient_list=[instance.email, ]
                  )

Я также использовал if not created вместо else.Но я получаю тот же результат.Кто-нибудь может предоставить какое-либо решение этого?Заранее спасибо.

обновление:

Моя функция просмотра для регистрации пользователя может быть полезна для решения проблемы.Вот функция просмотра:

def signup(request):
    """
    Render signup form if request is GET else create user
    """
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'registration/signup.html', {'form': form})

1 Ответ

1 голос
/ 22 апреля 2019

Предполагая, что вы используете встроенный поток регистрации Django, это будет означать 2 действия для модели User:

  1. Он создаст объект User, таким образом запустив сигнал post_save с created=True, и вы отправите первое электронное письмо.
  2. После регистрации Django входит в систему и обновляет свое поле last_login, тем самым генерируя еще один сигнал post_save с created=False
...