Django 2注册确认电子邮件定向到主页,而不是登录页面

时间:2019-03-09 14:44:55

标签: django django-views django-2.0

我正在设置Django 2.1应用程序,以便在用户注册时首先向他们发送一封确认电子邮件,并带有链接以单击以激活该帐户。

到目前为止,我已经成功地进行了设置(在另一篇文章的帮助下),并且一切正常,直到单击激活电子邮件为止。

当我将链接复制并粘贴到浏览器中时,它会将我定向到主登录页面,而不是登录页面。

有人可以查看我的视图并查看是否缺少某些内容吗?

def register_view(request):
    if request.method == 'POST':
        # Post request.
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()

        mail_subject = 'Activate your account.'
        current_site = get_current_site(request)
        uid = urlsafe_base64_encode(force_bytes(user.pk)).decode()
        token = account_activation_token.make_token(user)
        activation_link = "{0}/?uid={1}&token{2}".format(current_site, uid, token)
        message = "Hello {0},\n {1}".format(user.username, activation_link)
        to_email = form.cleaned_data.get('email')
        email = EmailMessage(mail_subject, message, to=[to_email])
        email.send()
        return HttpResponse('Please confirm your email address to complete the registration')

       else:
           # Get request.
           form = UserRegisterForm()
       return render(request, 'users/register.html', {'form': form})

def activate(request, uidb64, token):
        try:
            uid = urlsafe_base64_decode(uidb64).decode()
            user = User.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):
            # activate user and login:
            user.is_active = True
            user.save()
            messages.success(request, f'Your account has been created {username}. Login.')
            return render(request, 'users/login.html')
        else:
            return HttpResponse('Activation link is invalid!')

urls.py

path('activate/<str:uid>/<str:token>',
    user_views.activate,
    name='activate'),

tokens.py

class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) +
            six.text_type(timestamp) +
            six.text_type(user.is_active)
        )

account_activation_token = AccountActivationTokenGenerator()

1 个答案:

答案 0 :(得分:1)

我无法确认整个注册功能是否正常运行,但是为了回答您的特定问题,您的代码正在创建一个Activation_link,设置为:

activation_link = "{0}/?uid={1}&token{2}".format(current_site, uid, token)

如果仔细观察,它会创建类似以下内容的

http://example.com/?uid=....&token=....

但是您在urls.py中的路径是

path('activate/<str:uid>/<str:token>', user_views.activate, name='activate')

这意味着它期望像

http://example.com/activate/..../....

因此,解决方法只是将activation_link更改为

activation_link = "{0}/activate/{1}/{2}".format(current_site, uid, token)

再次,只问您要问的特定问题。

除了您的问题之外,您可能希望研究现有的软件包,例如django-registration或更完整的软件包,例如django-allauth(如果以后需要,它可以支持注册流程和社交登录)