Python 如果Django信号中的块为真,为什么执行else块?

Python 如果Django信号中的块为真,为什么执行else块?,python,django,if-statement,django-models,django-signals,Python,Django,If Statement,Django Models,Django Signals,我正在编写一个信号函数,该函数将在用户注册时向用户发送注册通知电子邮件,并在用户更新用户配置文件时向用户发送更新通知电子邮件。为此,我使用了if-else块来检查created参数。如果为真,用户将收到注册通知。否则,用户将收到配置文件更新通知。当更新用户对象时,它可以正常工作。但是,当新用户注册时,if和else块都在执行,新注册用户将收到两个电子邮件通知:一个注册通知和一个配置文件更新通知。完整的信号代码如下所示: #myapp/signals.py from django.core.ma

我正在编写一个信号函数,该函数将在用户注册时向用户发送注册通知电子邮件,并在用户更新用户配置文件时向用户发送更新通知电子邮件。为此,我使用了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, ]
                  )
如果没有创建,我也使用了
,而不是
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})

假设您正在使用Django的内置注册流,这将意味着在
用户
模型上执行两项操作:

  • 它将创建
    User
    对象,从而用
    created=True
    触发
    post\u save
    信号,您将发送第一封电子邮件
  • 注册后,Django登录用户和字段,从而触发另一个
    post_save
    信号,其中
    created=False

  • 我认为在用户注册时的逻辑中,有两个动作,第一个是创建,第二个是更新。只需将打印或日志添加到您的信号中,您就会看到它。您是否使用任何自定义的注册表单来更新
    用户
    模型?注册时可能会有两个
    save
    呼叫。这就是为什么一个新用户会得到两个emails@AmanGarg我使用了一个自定义表单。但我想,问题是亚历克斯在回答中说了什么。我想这就是为什么我收到两封电子邮件的问题。但我有一个问题。如果上次登录表在evvery login中更新,用户为什么不在登录时收到更新电子邮件?我检查过,当用户登录时,他没有收到任何电子邮件。我发现了问题。这就是你所说的。我已经删除了“登录(请求,用户)”行,我只收到注册通知。