如何在Django中添加“通过用户名或电子邮件地址搜索”字段忘记密码

时间:2019-09-01 09:55:30

标签: python django django-forms web-frameworks

这是django默认的忘记密码形式。如何修改以添加“按用户名搜索”功能。例如“用户名/电子邮件”。有人可以帮我弄这个吗。我是django的菜鸟。刚刚开始学习。

def get_users(self, email):

    active_users = UserModel._default_manager.filter(**{
        '%s__iexact' % UserModel.get_email_field_name(): email,
        'is_active': True,
    })
    return (u for u in active_users if u.has_usable_password())

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, html_email_template_name=None,
         extra_email_context=None):
    """
    Generate a one-use only link for resetting password and send it to the
    user.
    """
    email = self.cleaned_data["email"]
    for user in self.get_users(email):
        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
        context = {
            'email': email,
            'domain': domain,
            'site_name': site_name,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'user': user,
            'token': token_generator.make_token(user),
            'protocol': 'https' if use_https else 'http',
            **(extra_email_context or {}),
        }
        self.send_mail(
            subject_template_name, email_template_name, context, from_email,
            email, html_email_template_name=html_email_template_name,
        )

1 个答案:

答案 0 :(得分:0)

我们可以使用Q objects [Django-doc]来搜索电子邮件字段和username字段:

from django.db.models import Q

def get_users(self, email):
    active_users = UserModel._default_manager.filter(
        Q(**{'%s__iexact' % UserModel.get_email_field_name(): email}) |
        Q(username=email),
        is_active=True
    )
    return (u for u in active_users if u.has_usable_password())

您可以将__iexact field lookup [Django-doc]添加到用户名中,因此,如果要以区分大小写的方式搜索用户名,请使用username__iexact=email

save函数中,您可能应该改用用户的email

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, html_email_template_name=None,
         extra_email_context=None):
    """
    Generate a one-use only link for resetting password and send it to the
    user.
    """
    email = self.cleaned_data["email"]
    for user in self.get_users(email):
        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
        email = getattr(user, UserModel.get_email_field_name())
        context = {
            'email': email,
            'domain': domain,
            'site_name': site_name,
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'user': user,
            'token': token_generator.make_token(user),
            'protocol': 'https' if use_https else 'http',
            **(extra_email_context or {}),
        }
        self.send_mail(
            subject_template_name, email_template_name, context, from_email,
            email, html_email_template_name=html_email_template_name,
        )