【问题标题】:Django-registration resend activation Email with new codeDjango-registration 重新发送带有新代码的激活电子邮件
【发布时间】:2016-09-15 03:16:11
【问题描述】:

我正在使用具有唯一电子邮件地址的 django-registration,如果用户请求并且帐户尚未激活,我希望能够将第二个激活表单发送到电子邮件。我在 Stackoverflow 上找到了这个link,但我不明白我应该把例程放在哪里。我已经把它放在我的应用程序的views.py中,我得到了错误

global name 'RegistrationProfile' is not defined

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

欢迎任何建议。

【问题讨论】:

  • 您是否尝试从注册中导入RegistrationProfile
  • 重新发送激活表格是什么意思?这没有任何意义。您的意思是重新发送激活电子邮件吗?这可能就是为什么在您发放赏金之前您的问题没有得到答复
  • 我已尝试导入 RegistrationProfile,是的,我想重新发送(或发送新的)激活电子邮件
  • 当我包含 from registration.models import RegistrationProfile 时,我收到错误“表 'mydb.registration_registrationprofile' 不存在”

标签: python django python-2.7 django-registration


【解决方案1】:

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

这被添加到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 将其定义为唯一的。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2012-04-27
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多