Django注册:重新发送带有新代码的激活电子邮件

7
我正在使用 django-registration 进行编程,并希望在用户请求时,如果账户尚未激活,则可以向其电子邮件发送第二个激活表单。我在 Stackoverflow 上找到了这个 链接,但我不知道应该把这个程序放在哪里。我已经将它放在我的应用程序的 views.py 中,但是我收到了错误提示。
global name 'RegistrationProfile' is not defined

由于RegistrationProfile是注册中的一个模型,但当激活表单被发送时它不会在我的数据库中创建表格/记录,因此我不知道如何访问它。欢迎任何建议。

你尝试从registration导入RegistrationProfile了吗? - marcusshep
你的意思是重新发送激活表单吗?那没有任何意义。你是不是想重新发送激活邮件?这可能是为什么在你发布赏金之前你的问题没有得到回复的原因。 - e4c5
我已经尝试导入RegistrationProfile,是的,我想重新发送(或发送新的)激活电子邮件。 - HenryM
当我包含 from registration.models import RegistrationProfile 时,我会收到错误提示 "Table 'mydb.registration_registrationprofile' doesn't exist"。 - HenryM
1个回答

4

好的,这是我想出来的解决方案。虽然可能不太美观,但对我有用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接