我正在使用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]
我该怎么做?谢谢
答案 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块中单独匹配电子邮件和用户名更快。就个人而言,我更喜欢使用过滤器/计数方式来检查而不是尝试/除外,但除此之外。