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

3
我将使用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个回答

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

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块中单独匹配电子邮件和用户名可能更快。个人而言,我更喜欢使用过滤器/计数的方式进行检查,而不是try/except,但这并不是重点。


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