首页 文章

Django-registration重新发送激活电子邮件与新代码

提问于
浏览
6

我正在使用带有唯一电子邮件地址的django-registration,并且我希望能够在用户请求并且帐户尚未激活的情况下向电子邮件发送第二个激活表单 . 我在Stackoverflow上发现了这个link但是我已经把它放在我的应用程序中's views.py and I' m得到了错误

global name 'RegistrationProfile' is not defined

这是因为RegistrationProfile是一个注册模型,但是当发送激活表单时它不会在我的数据库中创建一个表/记录,所以我不明白我是如何访问它的 .

任何的建议都受欢迎 .

1 回答

  • 2

    好的,这就是我提出的解决方案 . 它可能不是最漂亮的,但它对我有用 .

    这将添加到views.py中

    from .forms import ResendActivationEmailForm
    from django.core import signing
    from django.contrib.sites.shortcuts import get_current_site
    from django.template.loader import render_to_string
    
    
    def resend_activation_email(request):
    
        email_body_template = 'registration/activation_email.txt'
        email_subject_template = 'registration/activation_email_subject.txt'
    
        if not request.user.is_anonymous():
            return HttpResponseRedirect('/')
    
        context = Context()
    
        form = None
        if request.method == 'POST':
            form = ResendActivationEmailForm(request.POST)
            if form.is_valid():
                email = form.cleaned_data["email"]
                users = User.objects.filter(email=email, is_active=0)
    
                if not users.count():
                    form._errors["email"] = ["Account for email address is not registered or already activated."]
    
                REGISTRATION_SALT = getattr(settings, 'REGISTRATION_SALT', 'registration')
                for user in users:
                    activation_key = signing.dumps(
                        obj=getattr(user, user.USERNAME_FIELD),
                        salt=REGISTRATION_SALT,
                        )
                    context = {}
                    context['activation_key'] = activation_key
                    context['expiration_days'] = settings.ACCOUNT_ACTIVATION_DAYS
                    context['site'] = get_current_site(request)
    
                    subject = render_to_string(email_subject_template,
                                       context)
                    # Force subject to a single line to avoid header-injection
                    # issues.
                    subject = ''.join(subject.splitlines())
                    message = render_to_string(email_body_template,
                                               context)
                    user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
                    return render(request, 'registration/resend_activation_email_done.html')
    
        if not form:
            form = ResendActivationEmailForm()
    
        context.update({"form" : form})
        return render(request, 'registration/resend_activation_email_form.html', context)
    

    这将添加到forms.py中

    class ResendActivationEmailForm(forms.Form):
        email = forms.EmailField(required=True)
    

    我在注册时有一个名为resend_activation_email_form.html的新模板,在重新发送电子邮件时使用,但我使用了完全相同的模板来发送电子邮件 .

    我之所以基于电子邮件是因为我使用了独特的电子邮件,但基于用户名可能更明智,因为django-registration定义为唯一 .

相关问题