如何在Django密码重置中添加密码重置的用户名和电子邮件选项?

时间:2013-05-24 06:51:30

标签: python django forgot-password

我正在使用Django内置密码来允许用户重置密码。我的password_reset_form.html如下所示:

{% block title %}Reset Password{% endblock %}

{% block content %}
<p>Please specify your email address to receive instructions for resetting it.</p>

<form action="" method="post">
    <div style="display:none">
        <input type="hidden" value="{{ csrf_token }}" name="csrfmiddlewaretoken">
    </div>
     {{ form.email.errors }}
    <p><label for="id_email">E-mail address:</label> {{ form.email }} <input type="submit" value="Reset password" /></p>
</form>
{% endblock %}

目前,用户可以输入他们的电子邮件地址,并将密码重置指令发送给用户。我想修改它,以便用户可以输入他们的用户名或电子邮件地址,并在电子邮件中收到密码重置说明。我应该直接转到dist-packages并开始编辑密码重置文件,还是应该做其他事情? 如果用户输入用户名,我可以找到用户的电子邮件地址:

if not '@' in new_mail:
      email = User.objects.filter(username=new_mail).values_list('email')
      new_mail1 = email[0]

我该怎么做?谢谢

2 个答案:

答案 0 :(得分:4)

你绝对不应该编辑dist-packages文件。内置视图和表单不支持您想要的行为。我认为复制相关视图和表单的实现并修改它们是可以的。将django.contrib.auth.views.password_reset视图复制到您的视图文件。将django.contrib.auth.forms.PasswordResetForm复制到您的表单文件并向其添加用户名字段,并根据指定的内容修改用户搜索代码以搜索电子邮件或用户名。将password_reset视图中使用过的表单类更改为新的PasswordResetForm。这应该足够了。

答案 1 :(得分:1)

我会做这样的事情

{% block title %}Reset Password{% endblock %}

{% block content %}
<p>Please specify your username or email address to receive instructions for resetting it.</p>

<form action="" method="POST">
  {% csrf_token %}
  {{ form.email.errors }}
  <p>{{ form.email.label }}{{ form.email }} <button type="submit">Reset Password</button></p>
</form>
{% endblock %}

在POST变量中,您现在有了一封电子邮件或密码。如果人们会更多地使用电子邮件或用户名,你必须猜测。基于此,以下应该工作

from django.db.models import Q
email = request.POST.get('email, "")
u = User.objects.filter(Q(username=email)|Q(email=email))
if u.count() == 1:
  email_address = u[0].email
  # now you can send the user an email with instructions
if u.count() < 1:
  # invalid username or email
  return
if u.count() > 1:
  # unlikely but lets account for this anyway. I'll leave this up to you
  return

可能有一种更优雅的方式来检查用户,但这种方式基本上只有一个查询,并且可能比在try / except块中单独匹配电子邮件和用户名更快。就个人而言,我更喜欢使用过滤器/计数方式来检查而不是尝试/除外,但除此之外。