正在发送自定义密码重置表单

2024-04-26 04:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在django应用程序中通过访问某个url并通过POST方法传递电子邮件来重置密码。这是因为我想在android应用程序中使用它,它将有自己的形式。所以,我想我可以创建一个自定义密码重置表单,然后保存它,但它不起作用。在

from django.contrib.auth.forms import PasswordResetForm

class Custom_password_reset_form(PasswordResetForm):
    def __init__(self, email, **kwargs):
        super(Custom_password_reset_form, self).__init__(**kwargs)
        self.email = forms.EmailField(initial=email, max_length=254)


def mobile_password_reset(request):
    """Sends mail with password reset link."""
    email = request.POST.get('email')
    my_form = Custom_password_reset_form(email)

    if my_form.is_valid():
        print 'valid'
        my_form.save()
    else:
        print 'not valid'
        print my_form._errors
    return render(...)

验证总是失败,给出空的my_form._errors列表。我错过了什么?或者也许有更好的方法?在

正确代码:

自定义类是不必要的,应该删除。密码重置方法应如下所示:

^{pr2}$

需要注意的是,如果没有将django.contrib.sites应用程序添加到设置中,my_form.save()将无法工作。也可以通过添加以下参数来修复:my_form.save(request=request)。在


Tags: django方法selfform应用程序密码emailrequest
2条回答

您可以通过重写django的auth模块来实现这一点。 在您的网址.py在

url(r'^password_reset/$', PasswordReset.as_view(is_admin_site=True),
    {'is_admin_site': 'True'}),

在此之后,添加以下视图

^{pr2}$

在窗体中,添加窗体并在其中添加以下保存方法。在

def save(self, domain_override=None,
         subject_template_name='registration/password_reset_subject.txt',
         email_template_name='registration/password_reset_email.html',
         use_https=False, token_generator=default_token_generator,
         from_email=None, request=None):
    """
    Generates a one-use only link for resetting password and sends to the
    user.
    """
    from_email = 'From Email'
    from django.core.mail import send_mail

    user = User.objects.get(username=request.POST['username'])
    if not domain_override:
        current_site = get_current_site(request)
        site_name = current_site.name
        domain = current_site.domain
    else:
        site_name = domain = domain_override
        c = {
            'email': user.email,
            'domain': domain,
            'site_name': site_name,
            'uid': int_to_base36(user.id),
            'user': user,
            'token': token_generator.make_token(user),
            'protocol': use_https and 'https' or 'http',
        }
    subject = loader.render_to_string(subject_template_name, c)
    # Email subject *must not* contain newlines
    subject = ''.join(subject.splitlines())
    email = loader.render_to_string(email_template_name, c)
    send_mail(subject, email, from_email, [user.email])

当您提交该表单时,用户将收到包含令牌的链接的电子邮件。该链接只能使用一次。在

一种形式needs to be bound to data to be valid。您传递的是email参数,但没有data,因此表单将始终是未绑定的。对于未绑定的表单,is_valid()返回False,但没有错误。在

我不明白你的定制表格需要什么。如果emailrequest.POST中,为什么不直接将request.POST传递给正则的{}?在

my_form = PasswordResetForm(request.POST)

相关问题 更多 >