发送者AUTH_USER_MODEL的post_save信号在登录时触发

rwx*_*rwx 2 django django-admin

做了什么

我有一个自定义User模型,MyUser因为它在一个完整的例子中描述了文档上的自定义用户模型,所谓的UserProfileMyUser通过一对一的关系连接,就像在Django文档中描述的关于如何扩展一个现有的用户模型.

定制身份验证的文档中,有关如何将post_save信号与现有User模型连接的示例.

接下来,我将一个测试接收器放在一个由我的apps.py文件加载的signals.py中,就像在这个 SO答案中描述的那样.

组态

signal.py

def post_save_receiver(sender, instance, created, **kwargs):
    send_mail('Testing', "Just testing...", 'hell@earth.tld', ['admin@heaven.tld'], fail_silently=False)

post_save.connect(post_save_receiver, sender=settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

models.py

class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None):
    """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        """
        Creates and saves a superuser with the given email and password.
        """
        user = self.create_user(email,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user




class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin
Run Code Online (Sandbox Code Playgroud)

views.py

def UserLogin(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect("http://www.heaven.tld/account")
    else:
        if request.method == 'POST':
            form = UserLoginForm(request.POST)
            if form.is_valid():
                username = form.cleaned_data['username']
                password = form.cleaned_data['password']
                user = authenticate(username=username, password=password)
                if user is not None and user.is_active:
                    login(request, user)
                    return HttpResponseRedirect("http://www.heaven.tld/account")
                else:
                    error_msg = 'Please try again!'
                    return render(request, "development",
                        {'form':form,
                        'error_msg':error_msg,
                         })
            else:
                error_msg = "Please try again!"
                return render(request, "development",
                    {'form':form,
                    'error_msg':error_msg,
                    })
        else:
            form = UserLoginForm()
            return render(request, "development", {'form': form})
Run Code Online (Sandbox Code Playgroud)

问题

现在,如果我登录,我总是收到这封邮件,但我只想在创建用户时才想要它.

Dan*_*man 7

登录会导致更新last_login时间戳,从而触发保存.

正如其他人所说的那样,你只需要使用created信号接收的参数,但是你当前忽略了这个参数.