Django-registration - 一些激活

5

如何强制重新发送激活邮件给用户?例如,当他意外删除邮件时,他在我的网站上点击链接,django将向他发送新的激活邮件。


你能提供更多细节吗?是哪个链接? - kzh
用户意外删除了电子邮件。 然后,他登录网站并单击链接,重新发送激活链接。 我的问题是:我该如何制作该链接?视图文件中应该包含什么内容。 - DJpython
不幸的是,django-registration会将is_active设置为False,直到用户点击链接。默认的django登录功能检查确保is_active为True。我也正在寻找一种方法,允许用户登录并选择重新发送电子邮件。我认为这将需要大量更改django-registration,并添加一个用户配置文件,其中包含另一个布尔字段,指示他们是否确认了他们的电子邮件。您的网站必须在授权用户查看受限制部分的网站时检查此标志。 - mhost
4个回答

8

有一个管理操作可以完成这个任务。根据django-registration文档

如何重新发送激活邮件?

假设你使用的是默认后端,提供了一个自定义的管理员操作来完成此操作;在RegistrationProfile模型的管理员页面上,只需勾选您要为其重新发送电子邮件的用户的复选框,然后选择“重新发送激活电子邮件”操作即可。

没有内置的自动方法可以完成这个任务(django-registration应该如何找出三天前填写注册表单并删除其激活邮件的那个随机访问者?)。


8
他可以登录并在个人资料中点击“重新发送激活电子邮件”...这在许多网站上经常被使用。 - DJpython

5
以下视图函数将呈现一个带有单个电子邮件字段的表单,然后检查是否存在任何未激活该电子邮件的用户,如果过期则重新创建激活代码(哈希处理是从RegistrationProfile复制粘贴的),最后发送激活电子邮件。
class ResendActivationEmailForm(forms.Form):
    email = EmailField(required=True)

def resend_activation_email(request):
    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."),)

            for user in users:
                for profile in RegistrationProfile.objects.filter(user=user):
                    if profile.activation_key_expired():
                        salt = sha_constructor(str(random())).hexdigest()[:5]
                        profile.activation_key = sha_constructor(salt+user.username).hexdigest()
                        user.date_joined = datetime.now()
                        user.save()
                        profile.save()

                    if Site._meta.installed:
                        site = Site.objects.get_current()
                    else:
                        site = RequestSite(request)

                    profile.send_activation_email(site)

                    context.update({"form" : form})
                    return render_to_response("registration/resend_activation_email_done.html", context)

    if not form:
        form = ResendActivationEmailForm()

    context.update({"form" : form})
    return render_to_response("registration/resend_activation_email_form.html", context)

我应该把这个函数放在哪里?我不想改变我下载的django-registration版本,所以我把它放在了我的应用程序的views.py中(已经将表单放在forms.py中),但是我遇到了这个错误:全局名称'RegistrationProfile'未定义。 - HenryM

0

我的(丑陋的)解决方案是创建自己的登录视图:

from django.contrib.auth.views import login as django_login

def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          redirect_authenticated=None,
          authentication_form=AuthenticationForm):
    """
        Redirect to redirect_authenticated if user is authenticated or
        delegate to contrib login otherwise.
    """

    form = authentication_form(data=request.POST)

    if request.method == "POST":
        if not form.is_valid():

            non_field_errors = form.non_field_errors()

            if non_field_errors:
                # test if the account is not active
                user_inactive = non_field_errors[0].find(_("This account is inactive.")) != -1

                if user_inactive:
                    return render_to_response(template_name, {
                        'form': form,
                        'user_inactive' : user_inactive,
                    }, context_instance=RequestContext(request))

    return django_login(request, template_name=template_name,
              redirect_field_name=redirect_field_name,
              authentication_form=authentication_form)

然后在模板中使用上下文变量:

{% if user_inactive %}  
  <a href="/activation/resend/">Resend activation link</a>
{% else %}   
  <a href="{% url django.contrib.auth.views.password_reset %}">Forgot your password?</a> 
{% endif %}

当用户点击重新发送激活链接时,会出现一个要求输入注册电子邮件的表单。提交表单会触发新的帐户激活电子邮件。
希望这可以帮到您。

0

我更新了Ilya B.方法resend_activation_email。旧的方法在Python >= 2.5中显示sha弃用错误。

def resend_activation_email(request):

    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.")

            for user in users:
                for profile in RegistrationProfile.objects.filter(user=user):
                    if profile.activation_key_expired():
                        salt = hashlib.sha1(str(random.random())).hexdigest()[:5]
                        profile.activation_key = hashlib.sha1(salt+user.email).hexdigest()
                        user.date_joined = datetime.datetime.now()
                        user.save()
                        profile.save()

                    if Site._meta.installed:
                        site = Site.objects.get_current()
                    else:
                        site = RequestSite(request)

                    profile.send_activation_email(site)

                    context.update({"form" : form})
                    return render(request, 'registration/resend_activation_email_done.html', context)

    if not form:
        form = ResendActivationEmailForm()

    context.update({"form" : form})
    return render(request, 'registration/resend_activation_email_form.html', context)

我应该把这个函数放在哪里?我不想改变我下载的django-registration版本,所以我把它放在我的应用程序的views.py中(已经将表单放在forms.py中),但是我遇到了这个错误:全局名称“RegistrationProfile”未定义。 - HenryM

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