Django:激活电子邮件不会自动登录用户

时间:2018-08-08 11:07:20

标签: django django-views django-authentication

用户单击帐户激活链接时,他们将被重定向到我的激活视图:

def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = CustomUser.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        login(request, user)
        return redirect('/')
    else:
        return HttpResponse('Activation link is invalid!')

由于某些原因,当使用redirect('/')重定向它们时,它们不会自动登录,即在索引模板中,user.is_authenticatedFalse

如果有人知道为什么会这样,并且可以在单击激活链接后帮助我自动登录用户,我将非常感谢他们的帮助。

谢谢

杰克


我有一个自定义的登录视图,当我用此登录用户时,一切运行正常。令人困惑的是,它使用与激活视图相同的代码来登录用户。

def custom_login(request):
    if request.user.is_authenticated:
        return redirect('/')
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            if user.is_active:
                print(user)
                login(request, user)
                return redirect('/')
            else:
                return redirect('/login/')
        else:
            return redirect('/login/')
    else:
        form = LoginForm(label_suffix="")
    return render(request, 'core/login.html', {'form': form })

我的SETTINGS.py的相关部分是:

# Specify login url

LOGIN_URL = "/login/"

# Specify login/ logout redirect URLs

LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"

这是CustomUser模型:

class CustomUser(AbstractBaseUser):
    username = models.CharField(max_length=200, unique=True, verbose_name='Username')
    first_name = models.CharField(max_length=200, blank=True, null=True)
    last_name = models.CharField(max_length=200, blank=True, null=True)
    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    about = models.TextField(max_length=1000, null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    university = models.ForeignKey(University, on_delete=models.CASCADE, blank=True,
                                null=True, default=None)
    profile_image = models.ImageField(upload_to='profile_images/', blank=True, null=True)
    objects = CustomUserManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']
    def __str__(self):
        return self.username
    def has_perm(self, perm, obj=None):
        if self.is_admin:
            return True
        return False
    def has_module_perms(self, app_label):
        if self.is_admin:
            return True
        return False
    def num_points(self):
        postVotes = self.post_set.aggregate(models.Count('votes'))["votes__count"]
        commentVotes = self.comment_set.aggregate(models.Count('votes'))["votes__count"]
        if postVotes is None: postVotes = 0
        if commentVotes is None: commentVotes = 0
        return postVotes + commentVotes
    def num_posts(self):
        return self.post_set.count()
    def num_comments(self):
        return self.comment_set.count()
    def latest_activities(self):
        # nola = number of latest activities
        nola = 10
        latest_posts = Post.objects.filter(user=self).order_by('-datetime')[:nola]
        latest_comments = Comment.objects.filter(user=self).order_by('-datetime')[:nola]
        latest_subcomments = Subcomment.objects.filter(user=self).order_by('-datetime')[:nola]
        return sorted(chain(latest_posts, latest_comments, latest_subcomments),
                    key=lambda e: e.datetime, reverse=True)[:nola]
    def save(self, *args, **kwargs):
        # delete old file when replacing by updating the file
        try:
            this = CustomUser.objects.get(id=self.id)
            if this.profile_image != self.profile_image:
                this.profile_image.delete(save=False)
                print("deleting_old_image")
        except:
            # when new photo then we do nothing, normal case
            pass
        super().save(*args, **kwargs)

0 个答案:

没有答案