Django-registration 重新发送带有新代码的激活邮件

Django-registration resend activation Email with new code

我在 Whosebug 上使用 django-registration with unique email addresses and I want to be able to send a second activation form to an email if requested by the user and if the account is not already active. I've found this link,但我不明白应该将例程放在哪里。我已将其放入我的应用 views.py 中,但出现错误

global name 'RegistrationProfile' is not defined

这是因为 RegistrationProfile 是一个注册模型,但在发送激活表单时它不会在我的数据库中创建 table/record,所以我不知道如何访问它。

欢迎任何建议。

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

这是添加到 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 定义为唯一。